2016-05-02 11 views
3

nehme ich an diesen Datensatz haben:ignorieren einige Dinge mit n_distinct() in 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"))) 

und ich möchte wissen, wie viele einzelne thing2 mit jedem thing so verbunden sind,

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

gibt ich

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

was ist in Ordnung. Aber was ich bin wirklich interessiert ist die Anzahl der verschiedenen Dinge, die sind nichtd in jedem Faktor Ebene.

Ich konnte die Aussage oben umschreiben und umfassen eine filter() so dass

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

mich

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

gibt aber ich verliere die Tatsache, dass, wenn thing == 5, es aus dem resultierenden Datenrahmen fallen gelassen wird.

Was würde Ich mag zu sehen, ist ein dplyr (oder etwas anderes) Aussage, die mir gibt

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

ist das möglich?

Ich habe den schleichenden Verdacht, dass ich hier etwas sehr Einfaches übersehe.

+0

Sie können immer die "traditionelle" 'Länge (einzigartig (thing2! =" D "))' –

+0

Ich wusste, es war etwas einfaches, das ich übersehen wurde! Zwischen dieser und der Antwort unten hämmere ich meinen Kopf auf meinen Schreibtisch und frage mich, warum ich es nicht schon gesehen habe! – Steven

+0

eine gute Taktik, sich daran zu erinnern;) –

Antwort

3

Ich würde für:

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 

So dass selbst wenn Sie einen oder mehrere d, any gibt 1 zurück und entfernen Sie sie aus dem distinct.

+0

Ich wusste, dass ich etwas Einfaches vermisste. Danke, dass du das unterstrichen hast! – Steven

+0

Gern geschehen! –

+1

Ein dplyrish/idiomatischer Weg könnte sein: test%>% distinct%>% group_by (Sache)%>% tally (ding2! = "D") ' – Frank

Verwandte Themen