2013-09-24 14 views
9

R summarizing multiple columns with data.tableと同じ結果が必要ですが、いくつかのサマリー機能が必要です。R data.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 

がどのように私は2列目の列の名前( 'X1'、 '×2')を得ることができます:ここでは

は例

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

lapplynames(.SD)に、.SDの代わりに繰り返すことができます。このような何か:

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 
関連する問題