如何合并重复ID的行:用非NA值填充NA,保留共同非NA值
解决方案
可以使用dplyr包的分组汇总功能实现需求,核心逻辑是按id分组后,对每一列提取第一个非NA值(满足"保留任意非NA值"的要求),以此合并行并填充缺失值:
library(tidyverse) # 原始数据 data <- tribble(~id, ~othervar, ~it_1, ~it_2, ~it_3, ~it_4, ~it_5, ~it_6, "k01", "lum", "a", "b", "c", "a", NA, NA, "k01", "lum", NA, NA, NA, NA, "a", "d", "k02", "nar", "a", "b", "c", "b", NA, NA, "k03", "lum", "a", "b", "a", "c", NA, NA, "k03", "lum", "b", "b", "a", NA, "d", "e") # 合并重复ID的行 merged_data <- data %>% group_by(id) %>% # 对所有列取第一个非NA值,冲突时保留首个出现的非NA值 summarize(across(everything(), ~first(na.omit(.)))) %>% ungroup() # 查看结果 print(merged_data)
运行后得到的结果与预期一致:
# A tibble: 3 × 8 id othervar it_1 it_2 it_3 it_4 it_5 it_6 <chr> <chr> <chr><chr><chr><chr><chr><chr> 1 k01 lum a b c a a d 2 k02 nar a b c b NA NA 3 k03 lum a b a c d e
关键步骤说明
group_by(id):按id将数据分组,确保同一ID的行被归为一组across(everything(), ~first(na.omit(.))):对所有列执行操作,na.omit(.)移除列中的NA值,first()取剩余值的第一个(若有多组非NA值,保留首个出现的,符合"保留任意一个"的要求)ungroup():取消分组,恢复常规数据框结构
内容的提问来源于stack exchange,提问作者Humberto
相关产品推荐
相关产品推荐

