【问题标题】:Calculate the mean and sd of a column within a list计算列表中列的平均值和标准差
【发布时间】:2016-04-17 06:26:39
【问题描述】:

如果我有这份清单

set.seed(123)
thelist <- list(a=data.frame(x1=rnorm(10), x2=rnorm(10)),
                b=data.frame(x1=rnorm(10), x2=rnorm(10)),
                c=data.frame(x1=rnorm(10), x2=rnorm(10)))

> thelist
$a
            x1         x2
1  -0.56047565  1.2240818
2  -0.23017749  0.3598138
3   1.55870831  0.4007715
4   0.07050839  0.1106827
5   0.12928774 -0.5558411
6   1.71506499  1.7869131
7   0.46091621  0.4978505
8  -1.26506123 -1.9666172
9  -0.68685285  0.7013559
10 -0.44566197 -0.4727914

$b
           x1          x2
1  -1.0678237  0.42646422
2  -0.2179749 -0.29507148
3  -1.0260044  0.89512566
4  -0.7288912  0.87813349
5  -0.6250393  0.82158108
6  -1.6866933  0.68864025
7   0.8377870  0.55391765
8   0.1533731 -0.06191171
9  -1.1381369 -0.30596266
10  1.2538149 -0.38047100

$c
            x1          x2
1  -0.69470698  0.25331851
2  -0.20791728 -0.02854676
3  -1.26539635 -0.04287046
4   2.16895597  1.36860228
5   1.20796200 -0.22577099
6  -1.12310858  1.51647060
7  -0.40288484 -1.54875280
8  -0.46665535  0.58461375
9   0.77996512  0.12385424
10 -0.08336907  0.21594157

如何计算每个列表项的 x1 和 x2 的 meansd(例如 a:c?输出将是具有列名 mean_x1 的数据框(或对象或...)和mean_x2。每一行都对应一个列表名称(例如a:c)。我看过很多类似的帖子,但没有一个解决具体问题。

【问题讨论】:

  • 三列列表中两列的均值和 sd 不会以 3x2 对象结尾
  • 也可以library(data.table) ; f &lt;- function(x, ...) c(mean(x, ...), sd(x, ...)) ; rbindlist(thelist, idcol = "indx")[, setNames(lapply(.SD, f), c("Mean", "SD")), by = indx]

标签: r list apply


【解决方案1】:

怎么样:

do.call(rbind,lapply(thelist, function(d) data.frame(sd=lapply(d,sd),mean=lapply(d,mean))))

输出:

      sd.x1     sd.x2      mean.x1   mean.x2
a 0.9537841 1.0380734  0.074625644 0.2086220
b 0.9308092 0.5273024 -0.424558873 0.3220446
c 1.0825182 0.8564451 -0.008715537 0.2216860

【讨论】: