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

如何用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实现方式:

方法一:分步筛选

  1. 先识别符合条件的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)
  1. 基于筛选出的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:20:32