如何在R中合并同一ID的行并去除NA,实现每行对应唯一ID?
在R中合并同一ID的互斥行数据
首先还原你的示例数据(额外添加字符类型列演示兼容性):
df <- data.frame( ID = c(1,1), a = c(1, NA), b = c(NA, 2), c = c(NA, 3), d = c("sample_text", NA) # 字符类型列 )
因为数据各行互斥(同一列下同一ID不会有多个非NA值),可以用以下两种方法合并为每个ID一行:
方法1:使用dplyr包(tidyverse风格)
library(dplyr) df_combined <- df %>% group_by(ID) %>% summarise(across(everything(), ~first(na.omit(.)))) %>% ungroup()
group_by(ID):按ID分组across(everything(), ~first(na.omit(.))):对每一列提取第一个非NA值(因数据互斥,每个组的列仅存在一个有效值)ungroup():取消分组状态,返回标准数据框
方法2:使用base R(无需额外包)
df_combined <- aggregate(. ~ ID, data = df, FUN = function(x) na.omit(x)[1])
aggregate(. ~ ID):指定按ID分组,聚合所有其他列- 自定义函数
function(x) na.omit(x)[1]:过滤每列的NA值后取第一个(也是唯一的)有效数据
两种方法都能保留列的原始数据类型(包括字符类型),且处理结果一致。
内容的提问来源于stack exchange,提问作者PPenton
相关产品推荐
相关产品推荐

