2012-04-16 13 views
27

मेरे पास एक डेटा फ्रेम है जहां एक कॉलम प्रजातियों के नाम है, और दूसरा स्तंभ प्रचुरता मान है। नमूनाकरण प्रक्रिया के कारण, कुछ प्रजातियां एक से अधिक बार दिखाई देती हैं (यानी, इसमें प्रजाति एक्स के साथ एक से अधिक पंक्तियां हैं)। मैं उन प्रविष्टियों को मजबूत करना चाहता हूं और उनकी बहुतायत को जोड़ना चाहता हूं।डुप्लिकेट पंक्तियों को समेकित करें

उदाहरण के लिए

, इस डेटा फ्रेम दिया:

set.seed(6) 
df=data.frame(
    x=c("sp1","sp2","sp3","sp3","sp4","sp2","sp3"), 
    y=rpois(7,2)); df 

जो पैदा करता है:

x y 
1 sp1 2 
2 sp2 4 
3 sp3 1 
4 sp3 1 
5 sp4 3 
6 sp2 5 
7 sp3 5 

मैं चाहूँगा के बजाय उत्पादन: किसी भी मदद के लिए अग्रिम में

x y 
1 sp1 2  
2 sp2 9  (5+4) 
3 sp3 7  (5+1+1) 
5 sp4 3 

धन्यवाद आप दे सक्ता!

उत्तर

35

यह काम करता है:

library(plyr) 
ddply(df,"x",numcolwise(sum)) 
शब्दों में

: (1) "x" कॉलम के आधार पर विभाजित डेटा फ्रेम df; (2) प्रत्येक खंड के लिए, प्रत्येक संख्यात्मक मूल्यवान कॉलम का योग लें; (3) परिणामों को एक ही डेटा फ्रेम में वापस चिपकाएं। (", इनपुट के रूप में एक अता फ्रेम ले एक अता फ्रेम लौटने के लिए" ddply खड़ा में dd)

एक और, संभवतः स्पष्ट, दृष्टिकोण:

aggregate(y~x,data=df,FUN=sum) 

एक संबंधित के लिए quick/elegant way to construct mean/variance summary table देखें (थोड़ा और जटिल) सवाल।

+0

डी 'ओह! Ddply के इस पाठ्यपुस्तक आवेदन कैसे मेरे पीछे पर्ची ... धन्यवाद बेन! संख्यात्मक और योग के आवेदन के लिए – jslefche

+0

+1। मैं वास्तव में काम करने के लिए इसे बदलने की कोशिश कर रहा है और परिवर्तन के साथ मजाक कर रहा था। –

+1

AFAIK, "कुल (y ~ x + z, data = df, FUN = sum)" का उपयोग * अतिरिक्त * कॉलम (यहां "z") को संरक्षित करने के लिए किया जा सकता है, क्या आवश्यकता होनी चाहिए (मेरे मामले में आवश्यकता थी)।कृपया मुझे सुधारें अगर मैं गलत हूं। – Shadow

20

सरल रूप में aggregate:

aggregate(df['y'], by=df['x'], sum) 
6
> tapply(df$y, df$x, sum) 
sp1 sp2 sp3 sp4 
    2 9 7 3 

अगर यह एक data.frame बेन जवाब अच्छा काम करता है हो गया है। या आप tapply आउटपुट को मजबूर कर सकते हैं।

out <- tapply(df$y, df$x, sum) 
>  data.frame(x=names(out), y=out, row.names=NULL) 
    x y 
1 sp1 2 
2 sp2 9 
3 sp3 7 
4 sp4 3 
8

समय और स्मृति क्षमता के लिए एक data.table समाधान

library(data.table) 
DT <- as.data.table(df) 
# which columns are numeric 
numeric_cols <- which(sapply(DT, is.numeric)) 
DT[, lapply(.SD, sum), by = x, .SDcols = numeric_cols] 

या, आपके मामले में, यह देखते हुए आप जानते हैं कि है कि वहाँ केवल 1 स्तंभ y आप

DT[, list(y=sum(y)),by=x] 
से अधिक योग करना चाहते हैं
1

यह सुनिश्चित करने के लिए एक MWE कि एक दूसरे चर (यानी, यहां "ज़ेड" और "एक्स" के अतिरिक्त, एक सूत्र को वास्तव में काम करेगा:

example = data.frame(X=c("x"),Z=c("a"),Y=c(1), stringsAsFactors=F) 
newrow = c("y","b",1) 
example <- rbind(example, newrow) 
newrow = c("z","a",0.5) 
example <- rbind(example, newrow) 
newrow = c("x","b",1) 
example <- rbind(example, newrow) 
newrow = c("x","b",2) 
example <- rbind(example, newrow) 
newrow = c("y","b",10) 
example <- rbind(example, newrow) 
example$X = as.factor(example$X) 
example$Z = as.factor(example$Z) 
example$Y = as.numeric(example$Y) 
example_agg <- aggregate(Y~X+Z,data=example,FUN=sum) 
6

एक dplyr समाधान:

library(dplyr) 
df %>% group_by(x) %>% summarise(y = sum(y)) 
संबंधित मुद्दे