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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:45:00