2011-09-16 15 views
32

लिए परिणाम जोड़ना मैं एक data.frame वस्तु है कहो। यह बहुत की तरह किया जा सकता है:गणना संख्या और डेटा फ्रेम

table(df[ , c("name","type")]) 

या plyr संभवतः भी साथ, (हालांकि मुझे यकीन है कि कैसे नहीं कर रहा हूँ)।

हालांकि, मैं मूल डेटा फ्रेम में परिणाम कैसे प्राप्त करूं? तो है कि परिणाम इस तरह दिखेगा:

df 
# name type num count 
# 1 black chair 4  2 
# 2 black chair 5  2 
# 3 black sofa 12  1 
# 4 red sofa 4  1 
# 5 red plate 3  1 

जहां count अब एकत्रीकरण से परिणाम संग्रहीत करता है।

plyr के साथ एक समाधान के रूप में अच्छी तरह से जानने के लिए, हालांकि मैं यह कैसे आधार आर के साथ किया जाता देखना चाहेंगे दिलचस्प हो सकता है

उत्तर

1

एक और तरीका है इसके साथ ही जी अधिक eneralizes:

df$count <- unsplit(lapply(split(df, df[c("name","type")]), nrow), df[c("name","type")]) 
+6

कृपया समझाएं कि यह कैसे सामान्यीकृत करता है? – smci

7

आप ऐसा कर सकते हैं: अधिक सहज

> ddply(df,.(name,type),transform,count = NROW(piece)) 
    name type num count 
1 black chair 4  2 
2 black chair 5  2 
3 black sofa 12  1 
4 red plate 3  1 
5 red sofa 4  1 

या शायद ,

> ddply(df,.(name,type),transform,count = length(num)) 
    name type num count 
1 black chair 4  2 
2 black chair 5  2 
3 black sofa 12  1 
4 red plate 3  1 
5 red sofa 4  1 
23

आप उपयोग कर सकते हैं ave:

df$count <- ave(df$num, df[,c("name","type")], FUN=length) 
50

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

plyr::ddply(df, .(name, type), transform, count = length(num)) 

data.table का उपयोग करना:

library(data.table) 
dt = data.table(df) 
# using setkey or setkeyv to set the key 
setkeyv(dt, c('name', 'type')) 
# self 
dt[dt[ , count = length(num), 'name, type']] 

संपादित करें (mnel)

data.table संस्करण 1.8.2 या अधिक से अधिक := समूह द्वारा किया गया है का उपयोग करना। वहाँ भी मूल्य .N (पेश किया संस्करण 1.6.2) है, जो समूह में पंक्तियों) की संख्या है, तो यह उतना आसान

dt[ , count := .N, by = list(name, type)] 

का प्रयोग के रूप में dplyr है:

library(dplyr) 
df %>% 
    group_by(name, type) %>% 
    mutate(count = n()) 

dplyr (0.6.0) के नए संस्करण

df %>% 
    add_count(name, type) 
+0

आप "setkeyv (डीटी, ग ('नाम', 'प्रकार' की ज़रूरत है)) "? – skan

2

आधार R समारोह aggregate एक एक लाइनर के साथ गिना जाता है प्राप्त करेंगे, लेकिन उन की गिनती के मूल data.frame में वापस जोड़ प्रसंस्करण का एक सा लेने के लिए लगता है।

df <- data.frame(name=c('black','black','black','red','red'), 
       type=c('chair','chair','sofa','sofa','plate'), 
       num=c(4,5,12,4,3)) 
df 
# name type num 
# 1 black chair 4 
# 2 black chair 5 
# 3 black sofa 12 
# 4 red sofa 4 
# 5 red plate 3 

rows.per.group <- aggregate(rep(1, length(paste0(df$name, df$type))), 
          by=list(df$name, df$type), sum) 
rows.per.group 
# Group.1 Group.2 x 
# 1 black chair 2 
# 2  red plate 1 
# 3 black sofa 1 
# 4  red sofa 1 

my.summary <- do.call(data.frame, rows.per.group) 
colnames(my.summary) <- c(colnames(df)[1:2], 'rows.per.group') 
my.data <- merge(df, my.summary, by = c(colnames(df)[1:2])) 
my.data 
# name type num rows.per.group 
# 1 black chair 4    2 
# 2 black chair 5    2 
# 3 black sofa 12    1 
# 4 red plate 3    1 
# 5 red sofa 4    1 
3

यह आपके काम करना चाहिए:

df_agg <- aggregate(num~name+type,df,FUN=NROW) names(df_agg)[3] <- "count" df <- merge(df,df_agg,by=c('name','type'),all.x=TRUE)

0

एक दो लाइन विकल्प 0 की एक चर split पैदा करते हैं और फिर इसे भरने में split<- साथ करने के लिए, है, और lengths इस तरह:

# generate vector of 0s 
df$count <-0L 

# fill it in 
split(df$count, df[c("name", "type")]) <- lengths(split(df$num, df[c("name", "type")])) 

यह वांछित परिणाम देता है

df 
    name type num count 
1 black chair 4  2 
2 black chair 5  2 
3 black sofa 12  1 
4 red sofa 4  1 
5 red plate 3  1 

अनिवार्य रूप से, आरएचएस प्रत्येक नाम-प्रकार संयोजन की लंबाई की गणना करता है, जो "लाल.चैयर" और "black.plate" के लिए 0 के साथ लंबाई 6 का नामित वेक्टर लौटाता है। यह split <- के साथ एलएचएस को खिलाया जाता है जो वेक्टर लेता है और उचित रूप से उनके दिए गए स्थानों में मूल्य जोड़ता है। यह अनिवार्य रूप से क्या ave करता है, जैसा कि आप देख सकते हैं कि ave के अंतिम पंक्ति के बाद दूसरे स्थान

split(x, g) <- lapply(split(x, g), FUN) 

हालांकि है, lengthssapply(list, length) की एक अनुकूलित संस्करण है।

0

आप मूल डेटासेट में पंक्ति गणना को शामिल करने से केवल एक कदम दूर थे।

broom पैकेज से tidy() समारोह का उपयोग करना, एक डेटा फ्रेम में आवृत्ति तालिका बदलने और df के साथ आंतरिक में शामिल होने:

df <- data.frame(name=c('black','black','black','red','red'), 
         type=c('chair','chair','sofa','sofa','plate'), 
         num=c(4,5,12,4,3)) 
library(broom) 
df <- merge(df, tidy(table(df[ , c("name","type")])), by=c("name","type")) 
df 
    name type num Freq 
1 black chair 4 2 
2 black chair 5 2 
3 black sofa 12 1 
4 red plate 3 1 
5 red sofa 4 1