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