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

如何在R语言中获取数据框分组变量的交集?附示例

在R语言中获取数据框分组变量的交集

针对你给出的场景,这里有几种实用的方法可以提取各组共有的year值,并生成目标数据框df2:

方法一:Base R 实现

先找出所有在每个names组中都出现的year,再筛选原数据框保留这些年份的行:

# 定义原始数据框
df <- data.frame( 
  names = c(rep("cody", 10), rep("sam", 5)), 
  year = c(paste0("year",2000:2009), paste0("year",2000:2004)) 
)

# 计算每个year对应的分组数量,筛选出等于总组数的year(即所有组共有的年份)
total_groups <- length(unique(df$names))
common_years <- names(which(table(df$year) == total_groups))

# 筛选得到目标数据框
df2 <- df[df$year %in% common_years, ]

方法二:tidyverse(dplyr)实现(简洁版)

利用add_count统计每个年份的出现组数,再筛选出符合条件的行:

library(dplyr)

df <- data.frame( 
  names = c(rep("cody", 10), rep("sam", 5)), 
  year = c(paste0("year",2000:2009), paste0("year",2000:2004)) 
)

df2 <- df %>%
  # 给每个year添加出现的分组数
  add_count(year) %>%
  # 筛选出分组数等于总组数的行
  filter(n == n_distinct(names)) %>%
  # 移除临时的计数列
  select(-n)

方法三:tidyverse 实现(分步提取交集)

如果你想先明确提取各组year的交集,再筛选数据,可以这样做:

library(dplyr)
library(purrr)

df <- data.frame( 
  names = c(rep("cody", 10), rep("sam", 5)), 
  year = c(paste0("year",2000:2009), paste0("year",2000:2004)) 
)

# 按names分组提取year,再求所有组的交集
common_years <- df %>%
  group_split(names) %>%
  map(pull, year) %>%
  reduce(intersect)

# 筛选原数据框得到目标结果
df2 <- df %>% filter(year %in% common_years)

以上三种方法都能得到你需要的df2,可以根据自己的习惯选择使用。

内容的提问来源于stack exchange,提问作者user8304241

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:55:31