如何按id合并wave1-wave4列的非NA值?使用dplyr未成功
合并同一ID下多列非NA值的解决方案
针对你提出的需求,用dplyr可以快速实现,核心逻辑是按ID分组后,提取每列唯一的非NA值。
第一步:构造示例数据
先把你提供的示例数据转换成可运行的R代码:
library(dplyr) df <- tibble( id = c(1,1,1,1,2,2), wave1 = c(12, NA, NA, NA, 67, NA), wave2 = c(NA, 32, NA, NA, NA, NA), wave3 = c(NA, NA, 45, NA, NA, NA), wave4 = c(NA, NA, NA, 84, NA, 54) )
第二步:执行合并操作
通过分组+列遍历的方式完成数据合并:
result <- df %>% group_by(id) %>% summarize(across(wave1:wave4, ~ first(na.omit(.)))) %>% ungroup() # 输出结果 print(result)
运行后会得到你期望的结果:
# A tibble: 2 × 5 id wave1 wave2 wave3 wave4 <dbl> <dbl> <dbl> <dbl> <dbl> 1 1 12 32 45 84 2 2 67 NA NA 54
代码说明
group_by(id):将数据按ID分组,确保同一ID的行被归为一组处理across(wave1:wave4, ~ first(na.omit(.))):对每个wave列执行操作:先用na.omit()移除NA值,再用first()取剩下的唯一非NA值;如果某列全是NA,会返回NAungroup():取消分组,让结果回到普通数据框格式
内容的提问来源于stack exchange,提问作者D. Fowler
相关产品推荐
相关产品推荐

