R语言:基于ID合并重复行Text列并保留其余列数据的方法
解决R语言中按ID合并Text并保留其余列的问题
下面提供几种实用的方法来实现你的需求,涵盖tidyverse、data.table和基础R三种场景:
方法1:使用dplyr(tidyverse生态,代码简洁易读)
如果你的列数较多(比如Column A到Column X),推荐用across()函数批量处理非聚合列:
# 安装并加载dplyr install.packages("dplyr") library(dplyr) # 处理数据 df_processed <- df %>% group_by(ID) %>% summarise( Text = toString(Text), # 合并Text列,用逗号分隔 across(-c(ID, Text), first) # 对ID和Text外的所有列,取每个分组的第一个值(因同ID下值一致) ) %>% ungroup()
如果列数少,也可以手动指定列名:
df_processed <- df %>% group_by(ID) %>% summarise( Text = toString(Text), `Column A` = first(`Column A`), `Column B` = first(`Column B`) # 其他列依次添加即可 ) %>% ungroup()
方法2:使用data.table(高效处理大数据集)
data.table在处理百万级以上数据时性能优势明显:
# 安装并加载data.table install.packages("data.table") library(data.table) # 转换为data.table格式并处理 setDT(df) df_processed <- df[, c(.SD[1, -"Text"], list(Text = toString(Text))), by = ID]
解释:.SD[1, -"Text"]取每个ID分组的第一行并排除Text列,list(Text = toString(Text))合并当前分组的Text字符串,最后按ID分组聚合。
方法3:基础R实现(无需第三方包)
如果不想安装额外包,可以用aggregate结合merge完成:
# 先聚合Text列 text_agg <- aggregate(Text ~ ID, data = df, toString) # 提取每个ID对应的唯一非Text列数据 other_cols <- df[!duplicated(df$ID), -which(names(df) == "Text")] # 合并两个结果 df_processed <- merge(text_agg, other_cols, by = "ID")
验证示例
用你提供的测试数据验证:
# 构造示例数据框 df <- data.frame( ID = c(1,1,2,3,3), Text = c("apple", "banana", "pancake", "peach", "mango"), `Column A` = c("five", "five", "three", "two", "two"), `Column B` = c(22,22,8,5,5), stringsAsFactors = FALSE )
运行任意一种方法后,df_processed都会输出你期望的结果:
| ID | Text | Column A | Column B |
|---|---|---|---|
| 1 | apple, banana | five | 22 |
| 2 | pancake | three | 8 |
| 3 | peach, mango | two | 5 |
内容的提问来源于stack exchange,提问作者Derick Jones
相关产品推荐
相关产品推荐

