You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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都会输出你期望的结果:

IDTextColumn AColumn B
1apple, bananafive22
2pancakethree8
3peach, mangotwo5

内容的提问来源于stack exchange,提问作者Derick Jones

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:40:38