如何将含NA的9行R数据框合并为3行完整数据?
合并含NA的9行数据框为3行完整数据的R实现
问题背景
需要将包含多个NA值的9行数据框合并为3行完整数据,示例数据如下:
data <- data.frame('a' = c('1','2','3','4','5','6','7','8','9'), 'b' = c(1,2,NA,NA,NA,2,NA,NA,NA), 'c' = c(NA,1,3,NA,NA,NA,NA,NA,3), 'd' = c(NA,NA,NA,4,5,2,NA,NA,NA), 'e' = c(2,NA,NA,NA,NA,3,1,NA,NA), 'f' = c(NA,3,NA,NA,NA,NA,NA,5,3))
补充条件:除a列外,每列均有3个有效观测值,a列可忽略,后续需基于结果计算ICCs。
期望输出:
b c d e f 1 1 1 4 2 3 2 2 3 5 3 5 3 2 3 2 1 3
此前尝试coalesce()仅能合并两列,无法适配多行列场景;按c(1,1,1,2,2,2,3,3,3)分组后仍得到含NA的行,现需可行的R脚本及说明。
解决方案
核心思路
观察数据可发现:除a列外,每列的3个非NA值的顺序恰好对应目标结果的3行。因此只需提取每列的非NA值,再将这些向量按列组合即可。
实现代码
方法1:基础R(无需额外包)
# 筛选需要处理的列(排除a列) target_cols <- setdiff(names(data), "a") # 提取每列的非NA值并组合成新数据框 result <- data.frame(lapply(data[target_cols], function(col) col[!is.na(col)])) # 查看结果 print(result)
方法2:dplyr包(语法更直观)
library(dplyr) result <- data %>% select(-a) %>% # 移除无关的a列 summarise(across(everything(), ~ .x[!is.na(.x)])) # 对所有列提取非NA值 print(result)
代码说明
setdiff(names(data), "a"):获取所有非a列的列名,确保只处理需要的列。lapply(..., function(col) col[!is.na(col)]):遍历每个目标列,筛选出其中的非NA值,返回一个包含3个元素的向量列表。data.frame(...):将列表转换为数据框,由于每个向量长度均为3,可直接对齐组合。- dplyr版本中,
select(-a)快速移除a列;across(everything(), ~ .x[!is.na(.x)])对所有列执行提取非NA值的操作,summarise将结果整合成结构规整的数据框。
内容的提问来源于stack exchange,提问作者Anna Seyffert
相关产品推荐
相关产品推荐

