Home > OS >  Wide to long without having an X in front of variables
Wide to long without having an X in front of variables

Time:10-24

I have my data in the wide-format

enter image description here

what is the easiest way to change it to long without having a X in front of the time variables

enter image description here

Sample data:

structure(list(X1 = c("01/12/2019", "02/12/2019"), `00:30` = c(41.95, 
39.689), `01:00` = c(44.96, 40.47), `01:30` = c(42.939, 38.95
), `02:00` = c(43.221, 40.46), `02:30` = c(44.439, 41.97)), class = "data.frame", row.names = c(NA, 
-2L), spec = structure(list(cols = list(X1 = structure(list(), class = c("collector_character", 
"collector")), `00:30` = structure(list(), class = c("collector_double", 
"collector")), `01:00` = structure(list(), class = c("collector_double", 
"collector")), `01:30` = structure(list(), class = c("collector_double", 
"collector")), `02:00` = structure(list(), class = c("collector_double", 
"collector")), `02:30` = structure(list(), class = c("collector_double", 
"collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), skip = 1L), class = "col_spec"))

CodePudding user response:

with pivot_longer and pivot_wider from tidyr:

dat |> 
  pivot_longer(names_to="time",values_to="val",`00:30`:`02:30`) |> 
  pivot_wider(names_from="X1", values_from="val")

Output:

# A tibble: 5 x 3
  time  `01/12/2019` `02/12/2019`
  <chr>        <dbl>        <dbl>
1 00:30         42.0         39.7
2 01:00         45.0         40.5
3 01:30         42.9         39.0
4 02:00         43.2         40.5
5 02:30         44.4         42.0

CodePudding user response:

I this special case, you could transpose the part of your data.frame containing numbers and assign the column names:

df_new <- data.frame(t(df[,-1]))
colnames(df_new) <- df[, 1]

This returns a data.frame df_new:

      01/12/2019 02/12/2019
00:30     41.950     39.689
01:00     44.960     40.470
01:30     42.939     38.950
02:00     43.221     40.460
02:30     44.439     41.970

Edit (Thanks to jay.sf)

For versions of R >= 4.1, you could use the natural pipe:

t(df[, -1]) |> 
  data.frame() |> 
  `colnames<-`(df[, 1])
  • Related