2016-03-26 8 views
5

I eine data.table in rZählnummer der eindeutigen Zeilen basierend auf zwei Säulen, die von Gruppe

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")) 

möchte ich einzigartige (distinct) Kombinationen von col1col2 und für jeden Wert von col4 zählen.

Erwartete Ausgabe ist

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 

Wie kann ich dies nur data.table Syntax in 1 tun?

+0

Hier sind einige andere, nicht-data.table Möglichkeiten: http://stackoverflow.com/questions/17421776/how- to-add-count-of-unique-values-by-group-to-r-data-frame – Frank

Antwort

13

Ich musste zuerst ein paar Versuche durchgehen, und endete damit. Jeder gute?

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 
> 

und die gleichen, aber schneller dank Procrastinatus Kommentar unten:

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

Ich bin ziemlich überrascht, dass Sie nicht 'uniqueN' verwenden. Irgendein bestimmter Grund dafür? – Jaap

+0

Ja ... Arun hat weitergemacht und ich habe das einzigartigeN vergessen! Nett. Wenn wir es betrachten, sollten wir sein 'by = NULL' für den Fall einstellen, dass' DT' durch 'col1' getastet wird? –

+0

Das wird nur die Anzahl für eindeutige Werte in "col1" geben, wenn ich das versuche (was OP nicht wollte). Übrigens: In Bezug auf die Geschwindigkeit scheint es, dass die Verwendung von 'length (unique())' [immer noch schneller als 'uniqueN'] ist (http://stackoverflow.com/questions/34007199/frequency-of-rows-by-id)) auf großen Datensätzen. – Jaap

Verwandte Themen