2013-07-02 11 views
33

पर अद्वितीय मानों की गिनती कैसे जोड़ें, मैं दूसरे चर के समूहबद्ध करके अद्वितीय मानों की संख्या गिनना चाहता हूं, और फिर मौजूदा डेटा में गिनती को नए कॉलम के रूप में जोड़ना चाहता हूं। उदाहरण के लिए, मौजूदा डेटा फ्रेम इस तरह दिखता है:समूह से आर डेटा.फ्रेम

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 

मैं हर color के लिए जोड़ना चाहते हैं, अद्वितीय types की गिनती है कि डेटा में मौजूद हैं:

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 

मैं करने की उम्मीद कर रहा था ave का उपयोग करें, लेकिन ऐसा लगता है कि एक सीधी विधि नहीं है जिसे कई लाइनों की आवश्यकता नहीं है। मेरे पास> 100,000 पंक्तियां हैं, इसलिए मुझे भी यकीन नहीं है कि दक्षता कितनी महत्वपूर्ण है।

यह कुछ हद तक इस मुद्दे के समान है: Count number of observations/rows per group and add result to data frame

उत्तर

39

का उपयोग ave (क्योंकि आप इसे विशेष रूप के लिए पूछना):

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

सुनिश्चित करें कि type चरित्र वेक्टर और नहीं कारक है बनाओ।


जब से तुम यह भी कहना है आपके डेटा बहुत बड़ा है और उस गति/प्रदर्शन इसलिए एक कारक हो सकता है, मैं भी एक data.table समाधान सुझाव देना चाहेंगे।

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 में लागू किया गया था और length(unique(.)) की एक तेजी से बराबर है। इसके अलावा यह डेटा.फ्रेम/डेटा.tables के साथ भी काम करता है।


अन्य समाधान:

का उपयोग plyr:

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

aggregate का उपयोग करना:

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

यहाँ dplyr पैकेज के साथ एक समाधान है - यह length(unique()) के लिए एक आवरण के रूप में n_distinct() है ।

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

यह भी एक vectorized में बिना समूह संचालन द्वारा table या tabulate

तो df$color साथ unique के संयोजन के द्वारा प्राप्त किया जा सकता factor, तो

या तो

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 

या

है
tabulate(unique(df)$color)[as.integer(df$color)] 
# [1] 2 2 2 1 1 2 2 3 3 3 

तो df$colorcharacter तो है बस

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

तो df$color एक integer तो बस

tabulate(unique(df)$color)[df$color] 
है
संबंधित मुद्दे