2015-01-27 11 views
11
ID= c('A', 'A', 'A', 'B', 'B', 'B') 
color=c('white', 'green', 'orange', 'white', 'green', 'green') 

d = data.frame (ID, color) 

Mein gewünschtes Ergebnis istWie kann die Anzahl der eindeutigen Werte pro Gruppe gezählt werden?

unique_colors=c(3,3,3,2,2,2) 
d = data.frame (ID, color, unique_colors) 

oder mehr klar in einem neuen Datenrahmen c

ID= c('A','B') 
unique_colors=c(3,2) 
c = data.frame (ID,unique_colors) 

ich verschiedene Kombinationen von aggregate und ave sowie by und with habe versucht, und ich nehme an es ist eine Kombination dieser Funktionen.

würde die Lösung umfassen:

length(unique(d$color)) 

die Anzahl der eindeutigen Elemente zu berechnen.

+1

Siehe auch [** hier **] (http://stackoverflow.com/questions/17421776/how-to-add-count-of-unique-values-by-group-to-r -data-frame/17421925 # 17421925), (etwas ähnlicher Titel auf dem Q ... hast du vor dem Posten gesucht?) für zusätzliche Möglichkeiten – Henrik

+0

@Henrik eigentlich enthält die verknüpfte Antwort weder 'dplyr' noch (up to date)) 'data.table' Lösungen. Also denke ich, dass diese neuere Frage in gewisser Weise nützlich ist. –

+0

@docendodiscimus deshalb habe ich * (up to date) 'data.table' Lösung * gesagt. Es enthält nicht die neue Funktion 'data.table :: uniqueN()'. Die 'data.table' Lösung ist im Grunde eine Basislösung. –

Antwort

36

Ich denke, Sie haben hier alles falsch. Es gibt keine Notwendigkeit weder in plyr noch in wenn data.table verwendet wird.

Aktuelle Versionen von data.table, v> = 1.9.6, haben eine neue Funktion uniqueN() nur dafür.

library(data.table) ## >= v1.9.6 
setDT(d)[, .(count = uniqueN(color)), by = ID] 
# ID count 
# 1: A  3 
# 2: B  2 

Wenn Sie eine neue Spalte mit den Zählungen erstellen möchten, verwenden Sie den := Operator

setDT(d)[, count := uniqueN(color), by = ID] 

Oder mit dplyr die n_distinct Funktion

library(dplyr) 
d %>% 
    group_by(ID) %>% 
    summarise(count = n_distinct(color)) 
# Source: local data table [2 x 2] 
# 
# ID count 
# 1 A  3 
# 2 B  2 

Oder verwenden (wenn Sie möchten eine neue Spalte) verwenden Sie mutate anstelle von summary

d %>% 
    group_by(ID) %>% 
    mutate(count = n_distinct(color)) 
+1

Sie waren so schnell :-) Danke für die 'uniqueN' – akrun

+2

@akrun Ich habe Arun gebeten,' uniqueN' zu erstellen, also musste ich dies als Antwort posten :) –

+0

Und die Funktion eines armen Mannes wäre 'mit (d, ave (as.numeric (Farbe), ID, FUN = Funktion (x) Länge (unique (x)))) ' – akrun

Verwandte Themen