在dplyr中使用n_distinct()忽略一些内容

时间:2016-05-02 13:37:54

标签: r dplyr

假设我有这个数据集:

test <- data.frame(thing = c(rep(1, 4), 
                         rep(2, 4), 
                         rep(3, 4), 
                         rep(4, 3), 
                         rep(5, 1)), 
                   thing2 = c(c("a", "b", "c", "c"), 
                              c("a", "b", "c", "d"),
                              c("a", "b", "b", "b"),
                              c("a", "b", "c"), 
                              c("d")))

我想知道每个thing2有多少个人thing,所以,

test %>%
  group_by(thing) %>%
  summarize(nDistinct = n_distinct(thing2))

给了我

  thing nDistinct
1     1         3
2     2         4
3     3         2
4     4         3
5     5         1

哪个好。但是,我真正感兴趣的是每个因子级别中 d的不同事物的数量。

我可以重写上面的陈述并包含filter()以便

test %>%
  group_by(thing) %>%
  filter(thing2 != "d") %>%
  summarize(nDistinct = n_distinct(thing2))

给了我

  thing nDistinct
1     1         3
2     2         3
3     3         2
4     4         3

但是我失去了这样一个事实:当thing == 5时,它会从结果数据框中删除。

我希望看到的是dplyr(或别的)语句给我

  thing nDistinct
1     1         3
2     2         3
3     3         2
4     4         3
5     5         0

这可能吗?

我有一种潜在的怀疑,我在这里忽略了一些非常简单的事情。

1 个答案:

答案 0 :(得分:3)

我会选择:

test %>%
  group_by(thing) %>%
  summarize(nDistinct = n_distinct(thing2) - any(thing2=="d"))

Source: local data frame [5 x 2]

thing nDistinct
(dbl)     (int)
1     1         3
2     2         3
3     3         2
4     4         3
5     5         0

即使您有一个或多个dany也会返回1并将其从distinct中删除。