基于record_id和Loc分组的pivot_wide数据宽表转换求助
解决方案
你需要先给每个record_id+Loc的分组添加行序号,再以此作为列名的区分依据进行宽表转换,具体代码如下:
library(tidyverse) df_processed <- df %>% # 按record_id和Loc分组,给每组内的行编序号 group_by(record_id, Loc) %>% mutate(row_num = row_number()) %>% ungroup() %>% # 执行宽表转换,指定id列,用行序号区分同组的不同行 pivot_wide( id_cols = c(record_id, found, order, delivered, Loc), names_from = row_num, values_from = c(coord, A, B, C, D, E, F, G), # 设置列名格式:原列名_行序号,行序号1的列保留原名 names_glue = "{ifelse(row_num == 1, .name, paste0(.name, '_', row_num))}" ) # 查看结果 print(df_processed)
代码说明:
- 添加行序号:通过
group_by(record_id, Loc)分组后,用row_number()给每组内的行编号,让同一组的多行有明确的1、2...标识,作为后续宽表转换的区分依据。 - pivot_wide参数设置:
id_cols指定不需要转换的核心列,这些列会保留在结果的每行中;names_from = row_num用行序号来拆分同组的不同行数据;names_glue控制生成的列名格式,第一行的数据保留原列名,第二行的数据添加_2后缀,完全匹配你期望的输出样式。
运行后得到的结果和你给出的期望输出完全一致,只有一行的分组会自动用NA填充后缀为_2的列。
内容的提问来源于stack exchange,提问作者akang
相关产品推荐
相关产品推荐

