首页 > 解决方案 > 用成对的行更宽地旋转

问题描述

我的数据如下所示:

id1   id2  date1        date2         len
1      3   2021-01-01   2020-12-01     2
2      3   2021-02-02   2020-12-31     1
3      5   2021-03-01   2020-09-30     3
4      5   2021-03-03   2021-01-30     4
...

每个id2正好有 2 行。如果我们让A代表这两行中的第一行和B第二行,我想得到这个:

id2   A.date1     A.date2     B.date1      B.date2     A.len     B.len
3     2021-01-01  2020-12-01  2021-02-02   2020-12-31    2         1
5     2021-03-01  2020-09-30  2021-03-03   2021-01-30    3         4

我认为可能有一种方法可以做到这一点,pivot_wider但我无法做到。

这是玩具数据:

data.frame(id1 = c(1, 2, 3, 4), id2 = c(3, 3, 5, 5), date1 = as.Date(c("2021-01-01", "2021-02-02", "2021-03-01", "2021-03-03")), 
         date2 = as.Date(c("2020-12-01", "2020-12-31", "2020-09-30", "2021-01-30")), len = c(2,1,3,4))

标签: rdplyr

解决方案


我们可以创建一个按“id2”分组的序列列(rowid从 data.table 一步完成)。使用该列作为names_from并指定多个列values_from

library(dplyr)
library(tidur)
library(data.table)
df1 %>% 
   # // or do a group by 
   # group_by(id2) %>%
   # mutate(rn = LETTERS[row_number()]) %>%
   mutate(rn = LETTERS[rowid(id2)]) %>% 
   select(-id1) %>% 
   pivot_wider(names_from = rn, values_from = c(date1, date2, len)) 

推荐阅读