Tidyverse собрать несколько столбцов - PullRequest
0 голосов
/ 20 марта 2020

У меня есть следующий фрейм данных:

df <- structure(list(ID = 1:4, col1.date = structure(c(1546188000,
1272294300, 1087908540, 1512241620), class = c("POSIXct", "POSIXt"
), tzone = "UTC"), col2.date = structure(c(1546237740, 1272928800,
1087966800, 1512277200), class = c("POSIXct", "POSIXt"), tzone = "UTC"),
col3.date = structure(c(1546323000, 1272949200, 1088049600,
1512396000), class = c("POSIXct", "POSIXt"), tzone = "UTC"),
col1.result = c(1.31, 0.95, 3.3, 0.55), col2.result = c(1.19,
1.57, 1.6, 0.59), col3.result = c(0.97, 2.13, 1.1, 0.57)), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -4L))

Я хотел бы иметь для каждого идентификатора три строки и два столбца: результат и дата.

Это то, что я пробовал:

df_long <- df %>%
gather(v, value, col1.date:col3.result) %>%
separate(v, c("var", "col")

однако я преобразовываю дату в цифру c.

Что я делаю не так?

1 Ответ

2 голосов
/ 20 марта 2020

Поскольку в конечном итоге вы хотите изменить форму нескольких столбцов (и это «новый способ» в tidyr-1.0.0), попробуйте pivot_longer. Этот ответ адаптирован непосредственно из примера на странице справки по адресу ?pivot_longer:

df %>%
  pivot_longer(
    col1.date:col3.result,
    names_to = c("set", ".value"),
    names_pattern = "(.*)\\.(.*)"
  )
# # A tibble: 12 x 4
#       ID set   date                result
#    <int> <chr> <dttm>               <dbl>
#  1     1 col1  2018-12-30 16:40:00  1.31 
#  2     1 col2  2018-12-31 06:29:00  1.19 
#  3     1 col3  2019-01-01 06:10:00  0.97 
#  4     2 col1  2010-04-26 15:05:00  0.95 
#  5     2 col2  2010-05-03 23:20:00  1.57 
#  6     2 col3  2010-05-04 05:00:00  2.13 
#  7     3 col1  2004-06-22 12:49:00  3.3  
#  8     3 col2  2004-06-23 05:00:00  1.6  
#  9     3 col3  2004-06-24 04:00:00  1.1  
# 10     4 col1  2017-12-02 19:07:00  0.55 
# 11     4 col2  2017-12-03 05:00:00  0.59 
# 12     4 col3  2017-12-04 14:00:00  0.570
...