假设我有这个数据集:
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
这可能吗?
我有一种潜在的怀疑,我在这里忽略了一些非常简单的事情。
答案 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
即使您有一个或多个d
,any
也会返回1并将其从distinct
中删除。