如何在R中将不同分组的观测值合并到同一行?
R语言数据整合:合并同一x对应的多列非NA值
方法一:dplyr分组汇总
利用dplyr的分组功能,对每个x组内的各y_列提取唯一的非NA值:
library(dplyr) result <- ydata %>% group_by(x) %>% summarize(across(starts_with("y_"), ~ first(na.omit(.)))) %>% ungroup()
starts_with("y_")自动匹配所有以y_开头的列(y_a至y_h)na.omit(.)移除列中的NA值,first()取剩余的唯一有效值(每组每列仅一个非NA值)
方法二:tidyr重塑数据
先将宽格式数据转长格式(丢弃NA),再转回宽格式实现整合:
library(tidyr) library(dplyr) result <- ydata %>% pivot_longer(cols = starts_with("y_"), names_to = "y_type", values_to = "value", values_drop_na = TRUE) %>% pivot_wider(names_from = y_type, values_from = value)
方法三:Base R原生实现
无需加载扩展包,用aggregate函数完成分组提取:
result <- aggregate(. ~ x, data = ydata[, !names(ydata) %in% "type"], FUN = function(x) x[!is.na(x)])
示例验证
构造你的示例数据测试:
ydata <- data.frame( x = c(1,2,3,1,2,3,1,2,3), type = c(1,1,1,2,2,2,3,3,3), y_a = c(1.3,2.7,4.4,NA,NA,NA,NA,NA,NA), y_b = c(NA,NA,NA,2.2,3.3,4.4,NA,NA,NA), y_c = c(NA,NA,NA,NA,NA,NA,3.3,7.6,11.3) ) # 运行任意一种方法后查看结果 print(result) #> x y_a y_b y_c #> 1 1 1.3 2.2 3.3 #> 2 2 2.7 3.3 7.6 #> 3 3 4.4 4.4 11.3
内容的提问来源于stack exchange,提问作者Brute Zero
相关产品推荐
相关产品推荐

