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

基于相同ID合并无重叠列数据行的实现方法求助

合并相同ID的行(R语言解决方案)

看起来你是在处理R语言里的数据框合并问题,同一ID的行把非空值分散在不同列,要整合到同一行里对吧?我给你几个实用的解决方法:

先构造可运行的示例数据

先把你提供的表格补全成能直接测试的数据框:

df <- data.frame(
  ID = c(1, 1, 1, 2, 2, 3),
  Name = c("Jack", "", "", "Mary", "", ""),
  Info = c("", "ABC", "", "", "DEF", ""),
  A = c("", "", "x", "x", "", ""),
  B = c("", "x", "", "", "", "y"),
  stringsAsFactors = FALSE
)

方法1:用base R的aggregate函数(解决你找不到字符串合并函数的问题)

你之前用aggregate卡壳,是因为没用到合适的自定义函数。其实可以自己写个函数提取每列的非空值:

# 自定义函数:提取向量里的非空值,没有的话返回空字符串
merge_non_empty <- function(x) {
  non_empty <- x[x != ""]
  if (length(non_empty) == 0) "" else non_empty
}

# 按ID分组,对每一列应用自定义函数
merged_df <- aggregate(. ~ ID, data = df, FUN = merge_non_empty)

运行后merged_df就是你要的结果,每个ID对应一行,各列都保留了该ID唯一的非空值。

方法2:用dplyr包(更简洁直观)

如果你习惯用tidyverse工具,dplyr的分组汇总操作会更顺手:

library(dplyr)

merged_df <- df %>%
  group_by(ID) %>%
  # 对每一列提取第一个非空值(因为同一ID每列只有一个非空值)
  summarise(across(everything(), ~ first(.x[.x != ""])), .groups = "drop")

也可以用paste合并(空字符串不会影响结果):

merged_df <- df %>%
  group_by(ID) %>%
  summarise(across(everything(), ~ paste(.x[.x != ""], collapse = "")), .groups = "drop")

方法3:base R的by函数

要是不想用aggregate,也可以用by函数分组处理:

# base R版的非空值提取函数
get_non_empty <- function(x) {
  non_empty <- x[x != ""]
  if (length(non_empty) > 0) non_empty[1] else ""
}

# 按ID分组处理每一行组
merged_list <- by(df, df$ID, function(row_group) {
  sapply(row_group, get_non_empty)
})

# 转换回数据框并清理行名
merged_df <- as.data.frame(do.call(rbind, merged_list), stringsAsFactors = FALSE)
rownames(merged_df) <- NULL

不管用哪种方法,最终都会得到ID为1、2、3的3行数据,每列都填充了对应ID的非空值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:48:35