2016-01-06 14 views
5

Użycie dplyr do podsumowania zestawu danych, chcę wywołać n_distinct, aby policzyć liczbę niepowtarzalnych wystąpień w kolumnie. Jednak chcę również wykonać kolejne zestawienie() dla wszystkich unikalnych wystąpień w kolumnie, w której spełniony jest warunek w innej kolumnie.dplyr n_distinct z warunkiem

Przykład dataframe nazwie "A":

A B 
1 Y 
2 N 
3 Y 
1 Y 

a %>% summarise(count = n_distinct(A))

Jednak chcę też dodać liczbę n_distinct(A) gdzie B == "Y"

Rezultatem powinno być:

count 
    3 

po dodaniu oszustwa datkowe wynik powinien być:

count 
    2 

Efektem końcowym staram się osiągnąć to oba zdania połączone w jedno połączenie, które daje mi wynik jak

count_all count_BisY 
     3   2 

Jaki jest właściwy sposób, aby przejść na ten temat z dplyr?

+0

można spróbować użyć: a%>% podsumowania (count = n_distinct (A [B == 'Y']))? – Gopala

+0

@ user3949008 Błąd: Wejście do n_distinct() musi być pojedynczą nazwą zmiennej z zestawu danych –

+0

Niestety, działa to n_distinct (df $ A [df $ B == 'Y']). – Gopala

Odpowiedz

6

Alternatywą jest użycie funkcji uniqueN z data.table wewnątrz dplyr:

library(dplyr) 
library(data.table) 
a %>% summarise(count_all = n_distinct(A), count_BisY = uniqueN(A[B == 'Y'])) 

co daje:

count_all count_BisY 
1   3   2 

Można również zrobić wszystko z data.table:

library(data.table) 
setDT(a)[, .(count_all = uniqueN(A), count_BisY = uniqueN(A[B == 'Y']))] 

co daje ten sam rezultat.

3

Filtrowanie dataframe przed wykonaniem podsumować prace

a %>% 
    filter(B=="Y") %>% 
    summarise(count = n_distinct(A)) 
+0

Rozumiem, że przepraszam za bycie niejasnym, moim celem końcowym jest uzyskanie wyniku, w którym pokazuje on liczbę całkowitą i liczbę, w której B == "Y" w jednej tabeli. Mogłem wykonać każdą z nich osobno i połączyć je w całość Przypuszczam, że –

+0

Czy można zastąpić filter() przez group_by (B)? Czy to ci daje to, czego chcesz? – Gopala

+0

Tak naprawdę myślę, że działa, po prostu dodaje dodatkową kolumnę i dodatkowe wiersze, gdzie naprawdę mogę to skonsolidować, aby kolumna reprezentująca liczbę 'B == 'Y''. Rozumiem, że to nie jest uporządkowane dane, ale to jest to, co próbuję osiągnąć. –

4

Powoduje to uzyskanie odrębnej liczby A przez każdą wartość B za pomocą dplyr.

library(dplyr) 
a %>% 
    group_by(B) %>% 
    summarise(count = n_distinct(A)) 

To daje wynik:

Source: local data frame [2 x 2] 

     B count 
    (fctr) (int) 
1  N  1 
2  Y  2 

do uzyskania żądanego wyjścia dodaną powyżej używając dplyr, można wykonać następujące czynności:

a %>% summarise(count_all = n_distinct(A), count_BisY = length(unique(A[B == 'Y']))) 

To daje wynik:

count_all count_BisY 
1   3   2 
1

We c również użyć aggregate z base R

aggregate(cbind(count=A)~B, a, FUN=function(x) length(unique(x))) 
# B count 
#1 N 1 
#2 Y 2 

podstawie oczekiwanej wyjściu OP

data.frame(count=length(unique(a$A)), 
      count_BisY = length(unique(a$A[a$B=="Y"]))) 
+0

Tak, na pewno agregacja jest dla mnie intuicyjna, ale próbuję nauczyć się języka dplyr, ponieważ testuje on wyższe prędkości i akceptuje więcej niż tylko ramka danych –

+0

@RyanCastner Dzięki za opinie. Ale w niektórych sytuacjach uważam, że przydatne są rozwiązania 'base R'. Na przykład ostatnio musiałem wdrożyć grupę według operacji w Alteryx, ale dostępna wersja ma pewne problemy z używaniem dplyr. Tak więc, musicie uciekać się do bazy R. – akrun