R按Name列合并重复行:缺失值保留原值、同列双值取均值
R语言按Name列合并同名行实现方案
需求说明
现有数据结构如下:
aa <- structure(list(`Name` = c("Greg", "Greg" ), Times = c("183538", NA), `Name alternative` = c("Tim", NA), `Comments` = c(NA_character_, "Pierce"), `RECEIVED DATE` = structure(c(1592870400, NA), class = c("POSIXct", "POSIXt"), tzone = "UTC"), `Sample No.` = c(12, 16), `EXP No.` = c(11, NA_real_), `TYPE` = c(5, NA)), row.names = 1:2, class = "data.frame")
需要实现的逻辑:
- 按
Name列分组,合并所有同名的行 - 数值型列如果存在多个有效值,取所有非缺失值的均值;如果仅一个有效值,直接保留该值
- 非数值型列(字符、日期等)保留所有非缺失值的有效内容,尽可能不丢失数据
实现代码
dplyr方案(代码简洁易读)
library(dplyr) merge_result <- aa %>% # 按Name列分组 group_by(Name) %>% # 对所有列应用处理规则 summarise(across(everything(), function(col) { # 数值类、日期时间类列计算非空均值 if (is.numeric(col) || inherits(col, "POSIXct")) { return(mean(col, na.rm = TRUE)) } # 其他类型列取第一个非空值 non_na_val <- na.omit(col) return(ifelse(length(non_na_val) > 0, non_na_val[1], NA)) })) %>% ungroup()
基础R方案(无需额外安装包)
merge_result <- aggregate(. ~ Name, data = aa, FUN = function(col) { if (is.numeric(col) || inherits(col, "POSIXct")) { return(mean(col, na.rm = TRUE)) } non_na_val <- na.omit(col) return(ifelse(length(non_na_val) > 0, non_na_val[1], NA)) }, na.action = na.pass)
输出结果说明
运行上述代码后,最终合并结果为1行Greg的记录,各列取值如下:
- Times: 183538
- Name alternative: Tim
- Comments: Pierce
- RECEIVED DATE: 2020-06-23
- Sample No.: 14(12和16的均值)
- EXP No.: 11
- TYPE:5
完全符合预设的合并规则,同时适配超过2行的同名数据合并场景。
内容的提问来源于stack exchange,提问作者Shaxi Liver
相关产品推荐
相关产品推荐

