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

如何将含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:57:01