【问题标题】:Ignore some things with n_distinct() in dplyr在 dplyr 中使用 n_distinct() 忽略一些事情
【发布时间】:2016-05-02 13:37:54
【问题描述】:

假设我有这个数据集:

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

这可能吗?

我偷偷怀疑我在这里忽略了一些非常简单的事情。

【问题讨论】:

  • 您始终可以使用“传统”length(unique(thing[thing2 != "d"]))
  • 我知道我忽略了一些简单的事情!在这个和下面的答案之间,我把头撞在桌子上,想知道为什么我还没有看到它!
  • 记住它的好策略;)

标签: r dplyr


【解决方案1】:

我会去:

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 中删除。

【讨论】:

  • 我知道我错过了一些简单的东西。感谢您指出这一点!
  • 一个更dplyrish/惯用的方式可能是test %&gt;% distinct %&gt;% group_by(thing) %&gt;% tally(thing2 != "d")
猜你喜欢
  • 2016-04-10
  • 2015-03-13
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多