2016-03-26 9 views
5

Ho una data.table in rnumero conte di righe uniche basate su due colonne, per gruppo

col1 col2 col3 col4 
1: 5.1 3.5 1.4 setosa 
2: 5.1 3.5 1.4 setosa 
3: 4.7 3.2 1.3 setosa 
4: 4.6 3.1 1.5 setosa 
5: 5.0 3.6 1.4 setosa 
6: 5.1 3.5 3.4 eer 
7: 5.1 3.5 3.4 eer 
8: 5.1 3.2 1.3 eer 
9: 5.1 3.5 1.5 eer 
10: 5.1 3.5 1.4 eer 


DT <- structure(list(col1 = c(5.1, 5.1, 4.7, 4.6, 5, 5.1, 5.1, 5.1, 
5.1, 5.1), col2 = c(3.5, 3.5, 3.2, 3.1, 3.6, 3.5, 3.5, 3.2, 3.5, 
3.5), col3 = c(1.4, 1.4, 1.3, 1.5, 1.4, 3.4, 3.4, 1.3, 1.5, 1.4 
), col4 = structure(c(1L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 4L), .Label = c("setosa", 
"versicolor", "virginica", "eer"), class = "factor")), .Names = c("col1", 
"col2", "col3", "col4"), row.names = c(NA, -10L), class = c("data.table", 
"data.frame")) 

voglio contare uniche combinazioni (distinti) di col1 e col2 per ciascun valore di col4.

risultato atteso è

col1 col2 col3 col4 count 
1: 5.1 3.5 1.4 setosa  4 
2: 5.1 3.5 1.4 setosa  4 
3: 4.7 3.2 1.3 setosa  4 
4: 4.6 3.1 1.5 setosa  4 
5: 5.0 3.6 1.4 setosa  4 
6: 5.1 3.5 3.4 eer  2 
7: 5.1 3.5 3.4 eer  2 
8: 5.1 3.2 1.3 eer  2 
9: 5.1 3.5 1.5 eer  2 
10: 5.1 3.5 1.4 eer  2 

Come posso fare questo in solo 1 sintassi data.table?

+0

Ecco alcuni altri modi non data.table: http://stackoverflow.com/questions/17421776/how- to-add-count-of-unique-values-by-group-to-r-data-frame – Frank

risposta

13

Ho dovuto fare prima alcuni tentativi e ho finito con questo. Nulla di buono?

DT[, count:=nrow(unique(.SD)), by=col4, .SDcols=c("col1","col2")] 
DT 
    col1 col2 col3 col4 count 
1: 5.1 3.5 1.4 setosa  4 
2: 5.1 3.5 1.4 setosa  4 
3: 4.7 3.2 1.3 setosa  4 
4: 4.6 3.1 1.5 setosa  4 
5: 5.0 3.6 1.4 setosa  4 
6: 5.1 3.5 3.4 eer  2 
7: 5.1 3.5 3.4 eer  2 
8: 5.1 3.2 1.3 eer  2 
9: 5.1 3.5 1.5 eer  2 
10: 5.1 3.5 1.4 eer  2 
> 

e gli stessi, ma più veloci grazie a Procrastinatus commento qui sotto:

DT[, count:=uniqueN(.SD), by=col4, .SDcols=c("col1","col2")] 
+1

Sono abbastanza sorpreso che tu non stia usando 'uniqueN'. Qualche ragione specifica per quello? – Jaap

+0

Sì ... Arun è andato avanti e io mi ero dimenticato di uniqueN! Bello. Guardandolo, dovremmo impostare 'by = NULL' nel caso in cui' DT' sia codificato da 'col1'? –

+0

Questo darà solo il conteggio dei valori univoci in 'col1' quando lo provo (che non è quello che l'OP voleva). Btw: per quanto riguarda la velocità, sembra che l'uso di 'length (unique())' sia [ancora più veloce di 'uniqueN'] (http://stackoverflow.com/questions/34007199/frequency-of-rows-by-id) su dataset di grandi dimensioni. – Jaap

Problemi correlati