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

如何汇总R语言DataFrame以去除NA值(支持多ID场景)

解决R语言DataFrame按id合并分散有效值的问题

针对你需要将同一id下分散在不同行的非NA值汇总为单行的需求,这里提供几种高效的解决方案,均支持多id的大规模数据框:

方法一:使用dplyr包(tidyverse生态)

利用group_by()分组后,结合across()和na.omit()提取每列的非NA值:

library(dplyr)

# 构造含多id的示例数据(模拟大规模场景)
id = c(1,1,1,2,2)
A = c(3,NA,NA,7,NA)
B = c(NA,5,NA,NA,9)
C= c(NA,NA,2,NA,NA)
D= c(4,NA,NA,NA,8)
df = data.frame(id,A,B,C,D)

# 按id汇总
df_summary <- df %>%
  group_by(id) %>%
  summarise(across(everything(), ~ na.omit(.)[1]))

# 查看结果
print(df_summary)

输出结果:

# A tibble: 2 × 5
     id     A     B     C     D
  <dbl> <dbl> <dbl> <dbl> <dbl>
1     1     3     5     2     4
2     2     7     9    NA     8

方法二:使用data.table包(适用于超大数据框)

data.table的分组运算效率更高,适合处理百万级以上的数据:

library(data.table)

setDT(df) # 将普通数据框转为data.table格式
df_summary <- df[, lapply(.SD, function(x) na.omit(x)[1]), by = id]

print(df_summary)

方法三:Base R原生解决方案(无需额外包)

用aggregate()函数即可实现:

df_summary <- aggregate(. ~ id, data = df, FUN = function(x) na.omit(x)[1])

print(df_summary)

注意事项

  • 如果某id下某列全为NA,汇总结果中该位置会保留NA(符合无有效值的实际情况)
  • 上述方法的核心逻辑是:同一id下每列仅有一个非NA值,因此取第一个非NA值即可得到目标结果

内容的提问来源于stack exchange,提问作者olikahn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:55:56