2013-07-02 38 views
33

İkinci bir değişkenin gruplanmasıyla benzersiz değerlerin sayısını saymak ve sonra sayımı varolan data.frame'e yeni bir sütun olarak eklemek istiyorum. Örneğin, mevcut veri çerçevesi aşağıdaki gibiyse:Grup tarafından R data.frame'e eş değerlerin sayısı nasıl eklenir

color type 
1 black chair 
2 black chair 
3 black sofa 
4 green sofa 
5 green sofa 
6 red sofa 
7 red plate 
8 blue sofa 
9 blue plate 
10 blue chair 

Her color için eklemek istediğiniz veri mevcut benzersiz types sayma:

color type unique_types 
1 black chair   2 
2 black chair   2 
3 black sofa   2 
4 green sofa   1 
5 green sofa   1 
6 red sofa   2 
7 red plate   2 
8 blue sofa   3 
9 blue plate   3 
10 blue chair   3 

Ben umuyordum ave kullanın, ancak çok satır gerektirmeyen basit bir yöntem bulmak için görünmüyor. > 100.000 satır var, bu yüzden verimliliğin ne kadar önemli olduğundan emin değilim.

Bu konuya biraz benziyor:

within(df, { count <- ave(type, color, FUN=function(x) length(unique(x)))}) 

type karakter vektör değil faktör olduğundan emin olun: Count number of observations/rows per group and add result to data frame

cevap

39

(özellikle bunun için sormak beri) ave kullanma. ayrıca veri çok büyük ve bu hız/performans dolayısıyla bir faktör olabilir demek yana


, ben de bir data.table çözüm önermek istiyorum.

require(data.table) 
setDT(df)[, count := uniqueN(type), by = color] # v1.9.6+ 
# if you don't want df to be modified by reference 
ans = as.data.table(df)[, count := uniqueN(type), by = color] 

uniqueNv1.9.6 uygulanan ve length(unique(.)) daha hızlı eşdeğerdir edildi. Ayrıca data.frames/data.tables ile de çalışır.


Diğer çözümler:

kullanılması plyr:

require(plyr) 
ddply(df, .(color), mutate, count = length(unique(type))) 

aggregate kullanarak:

agg <- aggregate(data=df, type ~ color, function(x) length(unique(x))) 
merge(df, agg, by="color", all=TRUE) 
30

Burada dplyr paketi ile ilgili bir çözüm değil - length(unique()) için bir sargı olarak n_distinct() sahip .

df %>% 
    group_by(color) %>% 
    mutate(unique_types = n_distinct(type)) 
4

Bu aynı zamanda table veya tabulate

ise df$color ile unique birleştirerek grup işlemleriyle olmayan bir vektörleşen elde edilebilir ve daha sonra,

ya

table(unique(df)$color)[as.character(df$color)] 
# black black black green green red red blue blue blue 
# 2  2  2  1  1  2  2  3  3  3 

ya

factor olduğu sonra character olduğunu
tabulate(unique(df)$color)[as.integer(df$color)] 
# [1] 2 2 2 1 1 2 2 3 3 3 

, sadece

table(unique(df)$color)[df$color] 

Eğer df$color sonra integer sadece

tabulate(unique(df)$color)[df$color] 
olduğunu
İlgili konular