如何用dplyr筛选col2值被多个col1类别共享的行?
解决方法:筛选被多类别共享的col2值对应的所有行
给定数据框:
col1 col2 col3 a 1 n1 a 1 n2 a 2 n3 a 2 n4 b 2 n5 b 3 n6 c 4 n7 c 5 n8 c 6 n9
需要筛选出col2的值被至少两个col1类别共享的所有行,最终保留col2=2的全部行。以下是两种可行的dplyr实现方式:
方法一:分步筛选
- 先识别符合条件的
col2值:
library(dplyr) # 构造示例数据 df <- tibble( col1 = c("a", "a", "a", "a", "b", "b", "c", "c", "c"), col2 = c(1, 1, 2, 2, 2, 3, 4, 5, 6), col3 = c("n1", "n2", "n3", "n4", "n5", "n6", "n7", "n8", "n9") ) # 获取被至少两个col1共享的col2值 shared_col2 <- df %>% distinct(col1, col2) %>% # 仅保留唯一的col1-col2组合,避免同一col1内的重复col2干扰计数 count(col2) %>% filter(n >= 2) %>% pull(col2)
- 基于筛选出的
col2值过滤原数据:
result <- df %>% filter(col2 %in% shared_col2)
输出结果:
# A tibble: 3 × 3 col1 col2 col3 <chr> <dbl> <chr> 1 a 2 n3 2 a 2 n4 3 b 2 n5
方法二:一步到位(更简洁)
直接用group_by结合n_distinct统计每个col2对应的唯一col1数量,再筛选符合条件的组:
result <- df %>% group_by(col2) %>% filter(n_distinct(col1) >= 2) %>% ungroup()
关键说明
之前用group_by+filter失败的核心原因是没有正确统计不同col1的数量,而是误统计了行的数量。n_distinct(col1)会直接计算每个col2组内唯一的col1个数,精准匹配需求;而distinct(col1, col2)则是先去重同一col1内的重复col2,确保计数的是不同类别共享的情况。
内容的提问来源于stack exchange,提问作者coffee_loving_narwhal
相关产品推荐
相关产品推荐

