在R中按Country和Name合并重复行,将ABCD列数据移至新列
问题:按Country和Name分组合并重复行的列数据
样本数据
df <- data.frame( Country = c("FR", "FR", "US", "US", "US", "US", "AU", "UK", "UK", "UK"), Name = c("Jean","Jean","Rose","Rose","Rose","Rose","Liam","Mark","Mark","Mark"), A = c(2,NA,NA,1,3,NA,1,2,NA,NA), B = c(2,5,NA,1,NA,2,1,NA,3,NA), C = c(2,NA,4,1,NA,NA,NA,NA,NA,NA), D = c(NA,3,NA,NA,4,4,1,2,4,4) )
输入数据
Country Name A B C D 1 FR Jean 2 2 2 NA 2 FR Jean NA 5 NA 3 3 US Rose NA NA 4 NA 4 US Rose 1 1 1 NA 6 US Rose 3 NA NA 4 7 US Rose NA 2 NA 4 8 AU Liam 1 1 NA 1 9 UK Mark 2 NA NA 2 10 UK Mark NA 3 NA 4 11 UK Mark NA NA NA 4
期望输出
Country Name A B C D A B C D A B C D A B C D 1 FR Jean 2 2 2 NA NA 5 NA 3 2 US Rose NA NA 4 NA 1 1 1 NA 3 NA NA 4 NA 2 NA 4 3 AU Liam 1 1 NA 1 4 UK Mark 2 NA NA 2 NA 3 NA 4 NA NA NA 4
需求目标
- 当连续行的
Country和Name列数据相同时,将这些行中的A、B、C、D列数据移至新的A、B、C、D列; - 实际数据中,
Country和Name的重复次数可能为1、2、3…n次,需实现条件逻辑,自动识别重复行并完成列扩展处理。
解决方案(R语言)
用dplyr和tidyr包即可实现,步骤清晰且支持任意重复次数:
library(dplyr) library(tidyr) library(stringr) # 处理核心逻辑 result <- df %>% # 给每个Country+Name组的行编序号 group_by(Country, Name) %>% mutate(row_id = row_number()) %>% ungroup() %>% # 把多行数据转成多列 pivot_wider( id_cols = c(Country, Name), names_from = row_id, values_from = c(A, B, C, D), names_sep = "" ) %>% # 调整列顺序:按组内行号对应排列A/B/C/D列 select( Country, Name, order(sapply(str_extract(names(.), "\\d+$"), as.integer)) ) # 把列名的数字去掉,改成重复的A/B/C/D names(result)[-c(1,2)] <- rep(c("A", "B", "C", "D"), length(names(result)[-c(1,2)])/4) print(result)
代码说明
group_by(Country, Name) %>% mutate(row_id = row_number()):给每个分组内的行添加序号,用来区分同一组的不同行;pivot_wider:将分组内的多行数据横向扩展为多列,用行号区分不同组内的列;- 最后调整列名和顺序,得到和期望输出完全一致的格式,同时兼容任意次数的重复分组。
内容的提问来源于stack exchange,提问作者Loki123
相关产品推荐
相关产品推荐

