3

我有一个返回向量和矩阵列表的函数。然后,我创建一个变量,该变量是对函数调用的几个结果列表的列表。所以我有一个列表列表。我的问题是如何在这些列表的元素上应用函数(注意这与在列表本身上应用函数不同)。这是一个简单的例子,它保留了我正在做的所有基本特征

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, and apply,但无法让它工作。原因之一是这x[[]][[2]][i,j]似乎是无效的符号

Error in x[[]] : invalid subscript type 'symbol'

我认为 R 不知道如何理解“ [[]]”。我知道有些人会建议向量化,但请注意,我的函数返回不同、不相关维度的矩阵和向量(尽管如果你有一个聪明的方法,我不反对向量化)。

4

3 回答 3

4

如果您知道要提取哪些元素,那么使用sapply/获取它们非常简单lapply,并获得平均值:

# Mean of [[2]][2, 3] elements
values = sapply(x, function(elem) {
  return(elem[[2]][2, 3])
})
mean(values)

sapply对外部列表的每个元素应用一个函数,该函数作为elem我编写的小匿名函数的参数传入。然后,您只需获取每个元素的第二个元素:elem[[2]],并对其进行索引以获取[2, 3]值。

于 2013-07-24T01:58:20.480 回答
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
于 2013-07-24T02:45:23.133 回答
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))
于 2013-07-24T02:27:09.427 回答