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

R语言:按组合并行并替换NA值

按ID分组合并多行到单行(去除NA)

没问题,我来帮你搞定这个数据整理需求!你的目标是按id分组,把每组内各列的非NA值合并到同一行,最终每个ID对应一行且没有NA值。刚好你的原始数据里每个分组的每一列都只有一个非NA值,这让处理起来非常直接。

方法1:使用dplyr包(tidyverse风格)

这是日常数据处理中最常用的tidyverse方案,用分组后提取非NA值的逻辑实现:

library(dplyr)

df_end <- df_start %>%
  group_by(id) %>%
  summarise(across(everything(), ~na.omit(.x)[1]), .groups = "drop")

# 查看结果
df_end

运行后会得到和你预期完全一致的结果:

# A tibble: 2 × 6
  id    b         c     d     e     f    
  <chr> <chr> <dbl> <dbl> <chr> <dbl>
1 as    A         2     4 3         5
2 bs    6         7     8 B        10

方法2:使用data.table包(高效处理大数据)

如果你需要处理超大规模的数据集,data.table的运行效率会更有优势:

library(data.table)

# 转换为data.table格式
dt_start <- as.data.table(df_start)

# 按id分组,提取每列的非NA值
df_end <- dt_start[, lapply(.SD, function(x) na.omit(x)[1]), by = id]

# 可选:转换回data.frame格式
df_end <- as.data.frame(df_end)

逻辑说明

因为你的原始数据中,每个id分组下的每一列都恰好只有一个非NA值,所以用na.omit(.x)去掉该列的所有NA后,剩下的唯一值就是我们需要的内容,取第一个元素[1]就能得到对应列的结果。如果后续遇到某列分组内有多个非NA值的情况,可以根据需求调整逻辑(比如用paste合并多个值),但当前场景下这个方案完全适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:17:38