1

我有一个简单的问题。我有一个对象列表。每个对象都包含几个列表。在这变得太复杂之前,让我举例说明:

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]][['predicted']] 中。每个预测列表都有一个与其预测值相关联的标签。我实际上想要做的是计算所有 100 个随机森林中每个标签的中值预测值。我想有效地做到这一点。在 Python 中,这很容易,但在 R 中我不太确定。无论如何,谢谢你的帮助!!!对此,我真的非常感激。

4

3 回答 3

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 
于 2013-09-21T07:04:49.087 回答
0

您可以对每个 A、B、C、... 使用一个简单的循环来执行此操作

x <- c()
for( i in 1:n ) x <- c( x, x[[i]][[a]][['A']] )
median(x)
于 2013-09-21T07:05:06.227 回答
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 

如果子列表包含的项目比您需要的多,假设您只想计算 , , 的中位数,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
于 2013-09-21T11:46:56.140 回答