2016-05-02 2 views
3

Предположим, у меня есть этот набор данных:Игнорировать некоторые вещи с n_distinct() в 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)) 

дает me

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

Вы всегда можете использовать «традиционную» длину (уникальную (вещь [thing2! = "D"])) ' –

+0

Я знал, что это было что-то простое, что я проглядывал! Между этим и ответом ниже я стучу головой на стол, удивляясь, почему я этого не видел! – Steven

+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.

+0

Я знал, что мне не хватает чего-то простого. Спасибо за указание на это! – Steven

+0

Добро пожаловать! –

+1

Более dplyrish/idiomatic способ может быть 'test%>% distinct%>% group_by (вещь)%>% tally (thing2! =" D ")' – Frank

Смежные вопросы