将函数应用于列表列表的特定元素

时间:2013-07-24 01:51:44

标签: r

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

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])。我试着玩(当然是阅读帮助文件)lapplyapply,但无法让它发挥作用。其中一个原因是x[[]][[2]][i,j]似乎是无效符号

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

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

3 个答案:

答案 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))