在R语言中合并相同标识符的行:DataFrame扁平化需求
解决DataFrame按Number分组合并非NA值的问题
问题场景
现有如下DataFrame:
# 示例数据 df <- tibble( Number = c(3, 3, 4), Superclass = c(NA, "Superclass: Benzenoids", "Superclass: Painkiller"), Class = c("Class: Benzene and substituted derivatives", NA, NA), Subclass = c(NA, NA, NA) )
需要按Number分组,将同一组内Superclass、Class、Subclass的非NA值合并到同一行,期望输出:
# Number Superclass Class Subclass # <dbl> <chr> <chr> <chr> # 1 3 Superclass: Benzenoids Class: Benzene and substituted derivatives NA # 2 4 Superclass: Painkiller NA NA
问题分析
你之前使用的summarise_all(na.omit)会过滤掉组内全为NA的列,同时错误移除仅部分列有值的分组行,不符合需求。
解决方案
使用dplyr的across函数对每列单独处理,提取组内第一个非NA值(无有效值则保留NA):
library(dplyr) df %>% group_by(Number) %>% summarise(across(everything(), ~ first(na.omit(.))), .groups = "drop")
原理说明
across(everything(), ~ first(na.omit(.))):对每一列先过滤NA值,再取第一个剩余值;若该列组内全为NA,first(na.omit(.))会返回NA,完美匹配需求。.groups = "drop":分组完成后取消分组状态,返回普通DataFrame结构。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

