我想要与R summarizing multiple columns with 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
代替别的东西,但是什么呢?有没有简单的解决方案?
答案 0 :(得分:14)
另一种方法是构造你自己的函数,这样你就可以避免这个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
答案 1 :(得分:4)
您可以在lapply
而不是names(.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