R语言group_by/aggregate操作需求:关联数据分组聚合问询
看起来你需要把同一个Affiliation_ID下的零散信息聚合起来补全缺失值对吧?针对你的数据集,我给你两种常用的实现方法,分别用dplyr的group_by和base R的aggregate:
方法一:使用dplyr的group_by + summarize
首先确保你安装并加载了dplyr包(如果没装过的话):
install.packages("dplyr") library(dplyr)
然后执行分组聚合,核心思路是按Affiliation_ID分组后,提取每个字段里的第一个非NA值——毕竟同一个ID对应的机构信息本就应该一致,只是不同行存在缺失:
affiliation_aggregated <- affiliation_clean %>% group_by(Affiliation_ID) %>% summarize( Affiliation_Name = first(na.omit(Affiliation_Name)), City = first(na.omit(City)), Country = first(na.omit(Country)), .groups = "drop" # 聚合完成后取消分组状态,方便后续操作 )
na.omit()会先剔除该组内字段的NA值,first()取剩下的第一个值——只要数据本身没问题,同一个ID的非NA值应该完全相同。
方法二:使用base R的aggregate函数
如果你不想加载额外的包,可以用base R的aggregate,先定义一个小函数来提取非NA值即可:
# 自定义函数:返回向量中的第一个非NA值,全NA则返回NA get_first_non_na <- function(x) { non_na_vals <- na.omit(x) if (length(non_na_vals) == 0) { return(NA) } else { return(non_na_vals[1]) } } # 执行聚合 affiliation_aggregated_base <- aggregate( . ~ Affiliation_ID, # 按Affiliation_ID分组,聚合所有其他列 data = affiliation_clean, FUN = get_first_non_na )
额外注意事项
如果你的数据里存在同一个Affiliation_ID下,某个字段有不同的非NA值(比如同一个ID的City同时出现"Las Cruces"和另一个城市),那上面的方法会取第一个值,但这其实是数据不一致的问题。你可以先跑下面的代码检查这种情况:
# 用dplyr检查每个组内字段是否唯一 inconsistent_data <- affiliation_clean %>% group_by(Affiliation_ID) %>% mutate( has_unique_name = n_distinct(na.omit(Affiliation_Name)) == 1, has_unique_city = n_distinct(na.omit(City)) == 1, has_unique_country = n_distinct(na.omit(Country)) == 1 ) %>% filter(!has_unique_name | !has_unique_city | !has_unique_country) # 如果输出不为空,说明存在不一致的数据,需要先清洗 print(inconsistent_data)
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

