如何在R语言中合并行以获取单条最完整数据行?
按个体合并数据框行的高效方法
原始数据
构造数据的代码:
a <- c('Bill', 'Bill', 'Jean', 'Jean', 'Jean', 'Louis') b <- c("A", "A", "B", NA, "B", NA) c <- c(0, 1, 0, 0, 0, 1) d <- c(1, 0, 1, 1, 0, 1) e <- c(1, 1, 0, 0, 1, 1) f <- data.frame(a, b, c, d, e) colnames(f) <- c("name", "letter", "red", "blue", "green")
原始数据预览:
name letter red blue green 1 Bill A 0 1 1 2 Bill A 1 0 1 3 Jean B 0 1 0 4 Jean <NA> 0 1 0 5 Jean B 0 0 1 6 Louis <NA> 1 1 1
需求目标
按name分组,每个个体仅保留一行,让各字段信息尽可能完整,最终结果如下:
name letter red blue green 1 Bill A 1 1 1 2 Jean B 0 1 1 3 Louis <NA> 1 1 1
高效解决方案
无需编写冗长循环,用R的分组聚合工具即可快速实现,以下提供两种适配不同数据规模的方案:
方案1:dplyr(通用高效,代码易读)
先安装并加载dplyr包:
install.packages("dplyr") library(dplyr)
核心逻辑:
- 字符列
letter:取分组内第一个非NA值(若全为NA则保留NA) - 数值列(red/blue/green):取分组内最大值(确保保留所有出现过的"1"状态)
执行代码:
result <- f %>% group_by(name) %>% summarise( letter = first(na.omit(letter)), red = max(red, na.rm = TRUE), blue = max(blue, na.rm = TRUE), green = max(green, na.rm = TRUE), .groups = "drop" ) # 查看结果 result
运行后即可得到目标输出。
方案2:data.table(适配超大型数据,速度更快)
如果数据量极大,推荐用data.table提升效率:
install.packages("data.table") library(data.table) setDT(f) result_dt <- f[, .( letter = first(na.omit(letter)), red = max(red, na.rm = TRUE), blue = max(blue, na.rm = TRUE), green = max(green, na.rm = TRUE) ), by = name]
特殊场景调整
若某分组的letter存在多个不同非NA值,可按需修改逻辑:
- 拼接所有不同值:
paste(unique(na.omit(letter)), collapse = "/") - 取最后一个非NA值:
last(na.omit(letter))
内容的提问来源于stack exchange,提问作者Katie Nissen
相关产品推荐
相关产品推荐

