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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:40:30