在R中对多个列表进行逐元素平均值计算

4

我有十个庞大的列表(每个列表有七个元素,但是这些元素都很大),我需要计算这些列表的逐个元素的平均值。因此,如果有A1、A2、A3、...、A10等列表,我需要计算:

mean1 = mean(A1[[1]], A2[[1]], A3[[1]], ...,A10[[1]])
.
.
.
mean7 = mean(A1[[7]], A2[[7]], A3[[7]], ....A10[[7]])

我用for循环做了它,但我想知道R是否提供了更好的解决方案。提前感谢。


1
你能提供一下你的列表样本吗?A1[[1]]是一个向量还是矩阵? - Jilber Urbina
1
我认为每个元素不是向量,而是由七个元素组成的列表,每个元素都是一个向量?! - George Steblovsky
实际上,真实数据太大了。但是每个Ax [[x]]都是一个数据框,我需要计算这些数据框的“nrow”的“mean”。 - hora
1
@hora:请提供一个非常小的例子,不要太大,并说明你期望得到什么结果。抱歉,但我实在无法理解"nrow"中的"mean"是什么意思。 - George Steblovsky
2个回答

7
如果您的A[[·]]是以下列表中的向量,
> ( List <- list(A=1:4, B=5:8, C=9:12) )
$A
[1] 1 2 3 4

$B
[1] 5 6 7 8

$C
[1]  9 10 11 12

那么您可以使用这种方法来获取平均值:

> rowMeans(simplify2array(List))
[1] 5 6 7 8

rowMeans(as.data.frame(List))将给您相同的结果。


是的,类似于我刚刚要尝试的:A1 <- 1:10; A2 <- 21:20; A3 <- 21:30; rowMeans(do.call(cbind,list(A1,A2,A3)))... :) - texb
很好地使用了simplify2array函数。它似乎在内部是matrix(unlist(.., use.names=FALSE), nrow=..) - Arun

3
假设您的 A 是向量列表:
Anames <- paste0("A", 1:10)

# for completeness
for(A in Anames)
    assign(A, lapply(1:7, function(x) rnorm(1000)))

sapply(1:7, function(i)
{
    m <- sapply(Anames, function(A) get(A)[[i]])
    mean(m)
})

这样做可以避免在内存中构建所有的A副本,而是一次获取一个并提取所需的向量。但如果您有足够的内存来存储所有数据,那么您可能也负担得起存储一个副本。

我用奇怪的方式提问了吗?是的,集群上有足够的内存,我正在检查解决方案是否有效,但这需要时间。 - hora
2
@hora 我认为如果你说“10个巨大的数据框架”而不是“10个巨大的列表”,可能会减少一些混淆。 - Hong Ooi

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