如何使用pivot_wider实现单ID单行的双值列宽表转换?
解决pivot_wider转换宽表的values_from参数问题
针对你的需求,直接通过pivot_wider的参数组合就能实现每个ID对应一行的宽表转换,核心是明确names_from和values_from的对应关系:
library(tidyr) # 你的示例数据 df<- data.frame(ID = c(1,1,2,2,3,3), category = c("A","B","A","C","A","C"), date = c(Sys.Date(), Sys.Date()-10, Sys.Date(), Sys.Date()-10, Sys.Date(), Sys.Date()-10)) # 执行宽表转换 wide_df <- pivot_wider( data = df, id_cols = ID, # 指定作为行唯一标识的列 names_from = category, # 用category的取值作为新列名 values_from = date # 用date列的值填充新生成的列 ) print(wide_df)
运行后会得到目标结构的宽表:
# A tibble: 3 × 4 ID A B C <dbl> <date> <date> <date> 1 1 2024-05-20 2024-05-10 NA 2 2 2024-05-20 NA 2024-05-10 3 3 2024-05-20 NA 2024-05-10
参数说明
id_cols: 锁定ID作为行的唯一标识,确保每个ID只保留一行names_from: 将category列的离散值(A/B/C)拆解为新的列名values_from: 指定用date列的内容填充这些新列
如果实际数据中存在同一ID+category对应多个日期的情况,可以用values_fn参数做聚合处理,比如取最新日期:
wide_df <- pivot_wider( data = df, id_cols = ID, names_from = category, values_from = date, values_fn = max # 取每个分组的最大日期 )
内容的提问来源于stack exchange,提问作者Lucca Nielsen
相关产品推荐
相关产品推荐

