You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:35:40