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
相关产品推荐
相关产品推荐

