我有一个返回向量和矩阵列表的函数。然后,我创建一个变量,该变量是对函数调用的几个结果列表的列表。所以我有一份清单清单。我的问题是如何在这些列表的元素上应用函数(注意这与在列表本身上应用函数不同)。这是一个简单的例子,它保留了我正在做的所有基本功能
numtrials = 5
x = rep(list(NULL),numtrials)
testfunction = function(){return( list( c(1,2,3,4,5), matrix(runif(10), 2,5),
matrix(0,2,2) ) )}
for(index in 1:numtrials){
x[[index]] = testfunction()
}
我想现在计算所有“索引”列表中x[[index]][[2]]
的{2,3}元素的平均值。或者甚至更好地获得方法矩阵xbar
,以便xbar[i,j] = mean(x[[]][[2]][i,j])
。我试着玩(当然是阅读帮助文件)lapply
和apply
,但无法让它发挥作用。其中一个原因是x[[]][[2]][i,j]
似乎是无效符号
Error in x[[]] : invalid subscript type 'symbol'
我认为R不知道该怎么做“[[]]
”。我知道有些人会建议矢量化,但请注意我的函数返回不同,不相关维度的矩阵和向量(尽管如果你有一个聪明的方法,我不反对向量化)。
答案 0 :(得分:4)
使用abind
,您可以创建一个列表,其中包含内部列表相关组件的数组。
例如
library(abind)
xl <- do.call(mapply, c('abind', x, rev.along = 0))
# the second element from each inner list is now within a 3-d array
# which is the 2nd element of xl
# you can now construct your matrix of mean values by using `apply`
means <- apply(xl[[2]], 1:2, mean)
means
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.4576039 0.5185270 0.7099742 0.3812656 0.4529965
## [2,] 0.6528345 0.2304651 0.5534443 0.4404609 0.7361132
答案 1 :(得分:3)
如果您知道要提取哪些元素,那么使用sapply
/ lapply
抓住它们非常简单,并获得平均值:
# Mean of [[2]][2, 3] elements
values = sapply(x, function(elem) {
return(elem[[2]][2, 3])
})
mean(values)
sapply
将一个函数应用于外部列表的每个元素,它作为elem
参数传递给我写的小匿名函数。然后,您只需获取每个元素的第2个元素:elem[[2]]
,并将其编入索引以获取[2, 3]
值。
答案 2 :(得分:0)
这是代码,它可以帮助您,首先取消列表,然后在其上面应用
ulist=function(x)
{
l=length(x)
for(i in 1:l) lst[[i]]=x[[i]][[2]]
return(lst)
}
#apply mean of each column of the x[[i]][[2]] matrix
sapply(ulist(x),function(y) apply(y,2,mean))
#apply mean of each row of the x[[i]][[2]] matrix
sapply(ulist(x),function(y) apply(y,1,mean))