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

R 将函数应用于列表上的元素,r,R,很抱歉问这么简单的问题,但我想不出一个好的方法来获取数据帧列表中的函数元素。我确信plyr/Reforme2包中有一些东西,但我就是想不起来 例如,我有一个列表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

很抱歉问这么简单的问题,但我想不出一个好的方法来获取数据帧列表中的函数元素。我确信plyr/Reforme2包中有一些东西,但我就是想不起来

例如,我有一个列表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()

也许
do.call

do.call(`+`, A)/length(A)
或者如果你真的不想把它放到一个更大的矩阵中

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

在这种情况下,您最好将数据放在
数组中,而不是列表中

#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)
#重新创建数据

A两张名单?。。。你所说的元素是什么意思?。。。整个数据框架?好的,我编辑了这个问题,以便更好地反映您的问题。希望我抓住了你要找的东西…抱歉,语言混乱。我想取每个数字的平均值,例如,列表中每个矩阵的位置[1,1]。任何一次操作两个对象的函数都将使用
Reduce
mean
只接受一个R对象,这就是它失败的原因。我认为没有通用的方法,但对于一类函数,可以定义一个简单的包装器,使其一次操作两个对象,并可以传递给
Reduce
。如果您可以发布您所使用的函数,这将非常有用。通常,除非所有数据列都是同源的(例如,如示例中的所有整数、所有因子、所有字符串或所有日期),否则无法将数据帧转换为数组。因此,您将被简化为
do.call()
方法。这类似于Reduce(),当我向它提供更复杂的函数(如“mean”)时,我遇到了问题实际上
mean
不够复杂;这将适用于任何接受多个参数并以矢量化方式处理它们的函数。根据进一步的信息,joran将其放入数组的方法是你想要的,尽管我添加了一个更笨拙的
sapply
解决方案,基本上只是将每个点依次绑定在一起。这就是@hadley不久前对我说的,它不会改变结构:
apply(abind,a,along=3),1:2,平均值)
不会影响A。哎呀,我想这是@DWin的一个小错误:
apply(abind(A,along=3),c(1,2),mean)