如何在R语言中将多行对角数据合并为单行?
嘿,这问题我熟!要把这种分组后分散在多行的非NA值合并成单行,有好几种简单的方法,我给你一一演示~
首先先确认下你的原始数据集:
dataset1 <- data.frame( id1 = c(1, 1, 1, 2, 2, 2), id2 = c(122, 122, 122, 133, 133, 133), num1 = c(1, NA, NA, 50,NA, NA), num2 = c(NA, 2, NA, NA, 45, NA), num3 = c(NA, NA, 3, NA, NA, 4) )
方法1:用dplyr(tidyverse风格,最常用)
如果你平时用tidyverse工具链,这个方法最直观:
library(dplyr) merged_data <- dataset1 %>% # 按id1和id2分组 group_by(id1, id2) %>% # 对每个num列提取非NA值(每组只有1个有效数据) summarize( num1 = first(na.omit(num1)), num2 = first(na.omit(num2)), num3 = first(na.omit(num3)), # 取消分组状态,避免后续操作报错 .groups = "drop" ) print(merged_data)
方法2:用data.table(大数据量首选,速度更快)
如果你的数据集很大,data.table的效率会更高:
library(data.table) # 把data.frame转成data.table setDT(dataset1) merged_data <- dataset1[, .( num1 = first(na.omit(num1)), num2 = first(na.omit(num2)), num3 = first(na.omit(num3)) ), by = .(id1, id2)] # 按id1和id2分组 print(merged_data)
方法3:基础R(不用加载任何包)
不想额外装包的话,用基础R的aggregate函数就能搞定:
merged_data <- aggregate(. ~ id1 + id2, data = dataset1, FUN = function(x) x[!is.na(x)]) print(merged_data)
不管用哪种方法,最终输出结果都是你想要的:
id1 id2 num1 num2 num3 1 1 122 1 2 3 2 2 133 50 45 4
内容的提问来源于stack exchange,提问作者Bikram Adhitya Adhikari
相关产品推荐
相关产品推荐

