R dplyr:按组过滤常见值

may*_*cca 4 r dplyr

我需要最好使用 dplyr 和 R 找到不同群体之间的共同价值观。

从我的数据集来看:

  group   val
  <fct> <dbl>
1 a         1
2 a         2
3 a         3
4 b         3
5 b         4
6 b         5
7 c         1
8 c         3
Run Code Online (Sandbox Code Playgroud)

预期输出是

group   val
<fct> <dbl>
1 a         3
2 b         3
3 c         3
Run Code Online (Sandbox Code Playgroud)

因为所有组中只有数字 3 出现。

这段代码似乎不起作用:

# Filter the data 

dd %>% 
  group_by(group) %>% 
  filter(all(val))           # does not work
Run Code Online (Sandbox Code Playgroud)

这里的示例解决了类似的问题,但具有定义的共享值向量。如果我不知道哪些是共享的怎么办?

虚拟示例:

# Reproducible example: filter all id by group
group = c("a", "a", "a",
          "b", "b", "b",
          "c", "c")
val = c(1,2,3,
        3,4,5,
        1,3)

dd <- data.frame(group,
                 val)
Run Code Online (Sandbox Code Playgroud)

Gre*_*gor 5

group_by隔离每个组,因此我们无法很好地group_by(group)在组之间进行比较。相反,我们可以group_by(val)查看哪些拥有所有组:

dd %>%
  group_by(val) %>%
  filter(n_distinct(group) == n_distinct(dd$group))
# # A tibble: 3 x 2
# # Groups:   val [1]
#   group   val
#   <chr> <dbl>
# 1 a         3
# 2 b         3
# 3 c         3
Run Code Online (Sandbox Code Playgroud)

这是我们想要在动词data$column中使用的罕见情况之一dplyr-n_distinct(dd$group)明确引用未分组的原始数据以获取组的总数。(它也可以预先计算。)而 是n_distinct(group)使用通过管道传入 的分组数据filter,因此它给出了每个值的不同组的数量(因为我们group_by(val))。