基于相同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
相关产品推荐
相关产品推荐

