如何在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
相关产品推荐
相关产品推荐

