使用data.table计算多列的R多元统计量

10

我希望得到与R 使用 data.table 对多列进行汇总相同的结果,但是可以对多个汇总函数使用。

这里是一个示例

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")
          ]

并获得以下结果:

   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

我该如何在第二列中获得列名('x1','x2')?我猜我需要将rbindlist替换为其他内容,但是换成什么呢?有没有简单的解决方案?

2个回答

15

另一种方法是构建自己的函数,这样您就可以避免使用rbindlist包装(我认为这是不必要的),从而使您可以自由地按照您想要的方式构建函数:

一个替代的方法就是你可以构造自己的函数,这样你就可以避免使用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

4
你可以针对names(.SD)进行lapply迭代,而不是使用.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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接