将函数应用于列表上的元素

时间:2011-08-16 21:15:28

标签: r

很抱歉这个简单的问题,但我想不出一个获取数据框列表的函数元素的好方法。我确信plyr / reshape2包中有一些东西,但我无法想到它。

例如,我有一个列表A如下:

>A
[[1]]
        [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
   [1,]    1    1    1    1    1    1    1    1    1     1
   [2,]    1    1    1    1    1    1    1    1    1     1
   [3,]    1    1    1    1    1    1    1    1    1     1
   [4,]    1    1    1    1    1    1    1    1    1     1
   [5,]    1    1    1    1    1    1    1    1    1     1

[[2]]
       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    2    2    2    2    2    2    2    2    2     2
 [2,]    2    2    2    2    2    2    2    2    2     2
 [3,]    2    2    2    2    2    2    2    2    2     2
 [4,]    2    2    2    2    2    2    2    2    2     2
 [5,]    2    2    2    2    2    2    2    2    2     2

假设我想在列表中的矩阵的相应元素中取平均值。一种方法是

Reduce("+",A)/length(A)

我似乎无法提供Reduce()更复杂的功能,并假设总体上有更好的方法。

2 个答案:

答案 0 :(得分:6)

在这种情况下,您可能最好使用array而非列表中的数据?

#Recreate data
A <- list(a=matrix(1,5,10),b=matrix(2,5,10))

#Convert to array
A1 <- array(do.call(cbind,A),dim = c(5,10,2))

#Better way to convert to array
require(abind)
A1 <- abind(A,along = 3)

#Now we can simply use apply
apply(A1,c(1,2),mean)

答案 1 :(得分:2)

也许do.call

do.call(`+`, A)/length(A)

或者,如果你真的不想abind将它变成更大的矩阵,

array(sapply(seq_along(A[[1]]), function(i) mean(sapply(A,`[`,i))), 
      dim=dim(A[[1]]))