2013-09-21 92 views
1

我有一個簡單的問題。我有一個對象列表。每個對象都包含一些列表。在此之前變得太複雜了,讓我來舉例說明:在列表中組合對象

X =列表

X [[1]] =一些對象

X [[2]] =另一個對象

...

X [[N]] =另一目的

正如我說,每個對象都包含更多的列表。但是我對一個特定的列表感興趣,我們稱它爲「a」。

X [[1]] [[α]] =( 'A':1, 'B':2, 'C':3,...,Z:26)

對不起,類似Python的語法!我真的只是在學習R.無論如何,我想要做的就是將這些對象中的列表結合起來,然後取其中值。爲了更清楚地說明,我想將所有'A'元素分組,然後取其中值:

x [[1]] [[a]] [['A']],x [[2 ]] [[a]] [['A']],x [[3]] [[a]] [['A']],...,x [[n]] [[a]] [ [ 'A']]

同樣地,我希望將所有 'B', 'C',..., 'Z' 的元素和把他們的中位...

X [[ 1]] [[a]] [['Z']],x [[2]] [[a]] [['Z']],x [[3]] [[a]] [['Z ']],...,x [[n]] [[a]] [['Z']]

所以問題是做這件事的最好方法是什麼?我花了數小時試圖弄清楚這一點!如果有人能幫助我,那將會很棒。

如果你想知道我在做什麼,基本上我有一個隨機森林對象列表(x)。所以x [[1]]是第一個隨機森林,x [[100]]是第100個隨機森林。每個隨機森林具有預測值的列表,其被存儲在例如X [[1]] [[ '預測']]。每個預測列表都有一個與其預測值相關的標籤。我實際想要做的是計算所有100個隨機森林中的每個標籤的中值預測值。我想有效地做到這一點。在Python中,這很容易,但在R中我不太確定。無論如何,感謝您的幫助!對此,我真的非常感激。

+1

使用像'lapply(yourList, 「[」,「預測「)' – Andrie

+0

@ab,因爲你是新手,你可能想閱讀[this](http://stackoverflow.com/about)和[this](http://meta.stackoverflow.com/help/有人-答案)。乾杯。 – Henrik

+0

謝謝安德烈!起初,這不起作用,但我最終得到了類似於工作的東西:sapply(list,function(y)y [['predicted']])。 –

回答

0

這裏有一種方法可以做到這一點。這有點困難,因爲你不能使用rapply作爲列表元素的名字的子集(這令人沮喪)。但是你可以選擇不公開,然後在名稱子集,並採取median這樣...

# Make some reproducible data 
set.seed(1) 
l <- list(a = sample(10,3) , b = sample(10,3) , c = sample(10,3)) 
ll <- list(l , l , l) 

# Unlist - we get a named vector but all a's have unique names - e.g. a1 , a2... an 
unl <- unlist(ll) 
# a1 a2 a3 b1 b2 b3 c1 c2 c3 a1 a2 a3 b1 b2 b3 c1 c2 c3 a1 a2 a3 b1 b2 b3 c1 c2 c3 
# 3 4 5 10 2 8 10 6 9 3 4 5 10 2 8 10 6 9 3 4 5 10 2 8 10 6 9 

# Subset by those elements that contian 'a' in their name 
a.unl <- unl[ grepl("a",names(unl)) ] 
# a1 a2 a3 a1 a2 a3 a1 a2 a3 
# 3 4 5 3 4 5 3 4 5 

# Take median 
median(a.unl) 
# [1] 4 

要遍歷多個名稱試試這個...

sapply(c("a" , "b" , "c") , function(x) median(unl[ grepl(x,names(unl)) ])) 
# a b c 
# 4 8 9 
+0

@ab a'for'循環並不真正優雅(恕我直言)。它通常很慢。嘗試編輯。 –

+0

謝謝!它絕對有效。另一個解決方案是使用sapply(上圖) –

0

,你可以用一個簡單的循環做到這一點對於每個A,B,C ...

x <- c() 
for(i in 1:n) x <- c(x, x[[i]][[a]][['A']]) 
median(x) 
0

創建頂層列表x樣本數據:

x <- replicate(3, list(a = as.list(setNames(sample(1:100, 26), LETTERS)), 
         b = runif(10)), 
       simplify = FALSE) 

首先,提取每個列表a

a.only <- lapply(ll, `[[`, "a") 

然後,計算所有A通過Z位數一杆,做:

do.call(mapply, c(a.only, FUN = function(...) median(unlist(list(...))))) 
# A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
# 55 59 41 21 93 72 65 74 51 42 87 25 60 40 13 77 35 31 92 51 57 37 87 67 29 46 

如果子列表包含比你更需要的項目,說你只需要計算在A中位數,CZ,做到:

a.slices <- lapply(a.only, `[`, c("A", "C", "Z")) 
do.call(mapply, c(a.slices, FUN = function(...) median(unlist(list(...))))) 
# A C Z 
# 55 41 46