2013-09-24 8 views
9

के साथ एकाधिक कॉलम के लिए एकाधिक आंकड़े मैं R summarizing multiple columns with data.table के समान परिणाम चाहता हूं लेकिन कई सारांश कार्यों के लिए।डेटा.table

group name  mean  sd 
1:  b varname 0.5755798 0.2723767 
2:  b varname 5.5108886 2.7649262 
3:  a varname 0.4906111 0.3060961 
4:  a varname 4.7780189 2.9740149 

मैं दूसरे कॉलम में स्तंभ नाम ('x 1', 'x2') कैसे प्राप्त कर सकते हैं:

यहाँ एक उदाहरण

data <- as.data.table(list(x1 = runif(200), x2 = 10*runif(200), group = factor(sample(letters[1:2])))) 

res <- data[, rbindlist(lapply(.SD, function(x) { 
       return(list(name = "varname", mean = mean(x), sd = sd(x))) 
      })) 
      , by = group, .SDcols = c("x1", "x2") 
      ] 

और निम्नलिखित परिणाम प्राप्त है? मुझे लगता है कि मुझे कुछ और करने के लिए rbindlist को प्रतिस्थापित करने की आवश्यकता है, लेकिन क्या? क्या कोई आसान समाधान है?

उत्तर

13

एक वैकल्पिक तरीका अपने खुद के समारोह का निर्माण करने के लिए इतना है कि आप इस rbindlist चादर से बच सकते हैं होगा (जो मुझे लगता है अनावश्यक है), जो आप देता है अपने काम को जिस तरीके से आप चाहते हैं उसे बनाने की स्वतंत्रता:

tmp <- function(x) { 
    mm <- colMeans(x) 
    ss=sapply(x, sd) 
    list(names=names(x), mean=mm, sd=ss) 
} 

data[, tmp(.SD), by=group] 
    group names  mean  sd 
1:  a x1 0.4988514 0.2770122 
2:  b x1 0.5246786 0.3014248 
3:  a x2 4.8031253 2.7978401 
4:  b x2 4.9104108 2.9135656 
+0

+1 यह अधिक सुरुचिपूर्ण है। – juba

4

.SD के बजाय names(.SD) पर आप अपने lapply को पुन: सक्रिय कर सकते हैं। कुछ इस तरह:

data <- as.data.table(list(x1 = runif(200), x2 = 10*runif(200), group = factor(sample(letters[1:2])))) 
res <- data[, rbindlist(lapply(names(.SD), function(name) { 
       return(list(name = name, mean = mean(.SD[[name]]), sd = sd(.SD[[name]]))) 
      })) 
      , by = group, .SDcols = c("x1", "x2")] 

कौन देता है:

group name  mean  sd 
1:  b x1 0.5344272 0.2697610 
2:  b x2 4.7628178 2.8313825 
3:  a x1 0.5008916 0.2686017 
4:  a x2 4.6175027 2.8942875 
संबंधित मुद्दे