一个棘手的支点更长

A Tricky Pivot Longer

我有一个这样的数据框:

data.frame(id = c(1,2,3),
           first_value=c("A","B","NA"),second_value=c("A","NA","D"), 
           first_date=c("2001",2010,2003),second_date=c("2003",2014,"2007"))
  id first_value second_values first_date second_date
1  1           A             A       2001        2003
2  2           B            NA       2010        2014
3  3          NA             D       2003        2007

我希望通过样本列表方式将其转换为像这样更长的数据帧:

 id timing value date
1  1  first     A 2001
2  1 second     A 2003
3  2  first     B 2010
4  2 second    NA 2014
5  3  first    NA 2003
6  3 second     D 2007

我没有成功使用 tidyr pivot_longer

你可以这样做:

library(tidyverse)
df %>%
  pivot_longer(cols = -id,
               names_pattern = '(.*)_(.*)',
               names_to = c('timing', '.value'))

给出:

# A tibble: 6 x 4
     id timing value date 
  <dbl> <chr>  <chr> <chr>
1     1 first  A     2001 
2     1 second A     2003 
3     2 first  B     2010 
4     2 second NA    2014 
5     3 first  NA    2003 
6     3 second D     2007 

注意:这仅在您将 second_values 列重命名为 second_value 时有效。我假设“值”只是一个错字?


根据@Maël 的建议,另一种更简单的方法:

df %>%
  pivot_longer(cols = -id,
               names_sep = '_',
               names_to = c('timing', '.value'))

可以尝试这样的事情吗?

library(tidyverse)

df <- data.frame(id = c(1,2,3),
              first_value=c("A","B","NA"),
              second_values=c("A","NA","D"), 
              first_date=c("2001",2010,2003),
              second_date=c("2003",2014,"2007"))

bind_rows(
  df %>% 
    select(id, first_value, date = first_date) %>% 
    pivot_longer(cols = "first_value", names_to = "timing"), 
  df %>% 
    select(id, second_values, date = second_date) %>% 
    pivot_longer(cols = "second_values", names_to = "timing")
  ) %>% 
  relocate(id, timing, value, date) %>% 
  arrange(id)

最后两行只是为了获得与您发布的相同的格式/顺序,因此可能会被省略。