在列表中组合对象

时间:2013-09-21 06:39:06

标签: r list coding-style statistics random-forest

我有一个简单的问题。我有一个对象列表。每个对象都包含几个列表。在此变得过于复杂之前,让我说明一下:

  

x =列表

     

x [[1]] =某个对象

     

x [[2]] =另一个对象

     

...

     

x [[n]] =另一个对象

正如我所说,每个对象都有更多列表。但是我对一个特定的列表感兴趣,我们称之为“a”。

  

x [[1]] [[a]] =('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中我不太确定。无论如何,谢谢你的帮助!我真的很感激。

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分:0)

你可以通过一个简单的循环为每个A,B,C,...

做到这一点
x <- c()
for( i in 1:n ) x <- c( x, x[[i]][[a]][['A']] )
median(x)

答案 2 :(得分: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")

然后,要一次性计算所有AZ个中位数,请执行以下操作:

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 

如果子列表包含的项目多于您需要的项目,请说您只想在ACZ上计算中位数,请执行以下操作:

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