2013-07-24 54 views
2

我有一個返回向量和矩陣列表的函數。然後我創建一個變量,該變量是從調用該函數得到的幾個列表的列表。所以我有一個列表清單。我的問題是如何在這些列表的元素上應用一個函數(注意這不同於在列表本身上應用函數)。這裏是保留了我在做什麼將函數應用於列表中的特定元素

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不知道做的「[[]]」什麼。我知道有些人會提出矢量化,但請注意,我的函數返回不同維度的矩陣和向量(儘管如果您有一個聰明的方法,我不會反對向量化)。

+1

這可能有助於在你的崗位上包括你想爲X [[指數]] [[2]]的(2,3)元素的平均價值。並且包括你想要的xbar的值。這將幫助其他人檢查他們的代碼是否會返回所需內容。至少它會幫助我。 –

+0

該矩陣是隨機的,所以它將取決於你的種子,Marius的帖子適用於特定的[2,3]例子,所以你可以使用該代碼來檢查你的代碼的全部矩陣的情況下,通過檢查[2, 3]元素對Marius的代碼 – MHH

回答

2

上應用使用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 
3

如果你知道你要拉出來哪些元素,那麼它是非常簡單的用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]值。

+0

這絕對適用於[2,3]的情況,但有沒有一種更簡單的方法來推廣它,而不是遍歷矩陣的條目? – MHH

+0

,我的意思是創建[[2]] [i,j]沒有循環的手段矩陣 – MHH

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)) 
+0

我不確定我明白這段代碼給出了什麼,它也不會產生正確答案,請使用馬呂斯的代碼來看看元素2,3它不符合你的。 – MHH

相關問題