2016-01-06 13 views
5

Utilizzando dplyr per riepilogare un set di dati, voglio chiamare n_distinct per contare il numero di occorrenze univoche in una colonna. Tuttavia, voglio anche fare un altro riepilogo() per tutte le occorrenze univoche in una colonna in cui una condizione in un'altra colonna è soddisfatta.dplyr n_distinct con condizione

Esempio dataframe chiamato "a":

A B 
1 Y 
2 N 
3 Y 
1 Y 

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

Tuttavia voglio anche aggiungere un conteggio di n_distinct(A) dove B == "Y"

il risultato dovrebbe essere:

count 
    3 

quando aggiungi il cono dizione il risultato dovrebbe essere:

count 
    2 

Il risultato finale che sto cercando di raggiungere è entrambe le affermazioni fuse in una chiamata che mi dà un risultato come

count_all count_BisY 
     3   2 

Qual è il modo appropriato per andare su questo con dplyr?

+0

Puoi provare utilizzando: un%>% sommari (count = n_distinct (A [B == 'Y']))? – Gopala

+0

@ user3949008 Errore: l'input su n_distinct() deve essere un nome di singola variabile dal set di dati –

+0

Spiacente, questo funziona n_distinct (df $ A [df $ B == 'Y']). – Gopala

risposta

6

Un'alternativa consiste nell'utilizzare la funzione uniqueN da data.table all'interno dplyr:

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

che dà:

count_all count_BisY 
1   3   2 

Si può anche fare tutto con data.table:

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

che dà lo stesso risultato.

3

Filtraggio dataframe prima di eseguire la summarize funziona

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

Capisco che, scusandomi per non essere chiaro, il mio obiettivo finale è avere un risultato dove mostra il conteggio del totale, e il conteggio dove B == "Y" in una tabella. Potrei fare ciascuno separatamente e riunirli insieme suppongo –

+0

Puoi sostituire filter() con group_by (B)? Ti prende ciò che vuoi? – Gopala

+0

Sì, in realtà penso che funzioni, aggiunge solo una colonna in più e righe extra in cui posso davvero averlo consolidato per avere una colonna che rappresenta il numero di 'B == 'Y''. Mi rendo conto che questo non è un dato ordinato ma è quello che sto cercando di ottenere –

4

Questo produce il conteggio A distinto per ciascun valore di B utilizzando dplyr.

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

Questo produce il risultato:

Source: local data frame [2 x 2] 

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

per produrre l'output desiderato aggiunto sopra utilizzando dplyr, è possibile effettuare le seguenti operazioni:

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

Questo produce il risultato:

count_all count_BisY 
1   3   2 
1

Noi c un anche usare aggregate da base R

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

Sulla base di risultati attesi del PO

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

Sì, certo, aggregato è piuttosto intuitivo per me, ma ho cercato di imparare il linguaggio dplyr perché confronta le velocità più veloci e accetta più di un semplice dataframes –

+0

@ RyanCastner Grazie per il feedback. Ma in alcune situazioni trovo utile avere le soluzioni di base R. Ad esempio, recentemente, ho dovuto implementare un gruppo per operazione in Alteryx, ma la versione disponibile ha alcuni problemi nell'utilizzo di dplyr. Quindi, devo ricorrere alla base R. – akrun