【问题标题】:Combining objects across a list跨列表组合对象
【发布时间】:2013-09-26 14:34:21
【问题描述】:

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

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 中我不太确定。无论如何,谢谢你的帮助!!!我真的很感激。

【问题讨论】:

  • 使用类似lapply(yourList, "[", "predicted")
  • @a b,因为您是 SO 新手,您可能需要阅读 thisthis。干杯。
  • 谢谢安德烈!起初,这不起作用,但我最终得到了类似的东西: sapply(list, function(y) y[['predicted']])。

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


【解决方案1】:

这是您可以做到的一种方法。这有点困难,因为您不能使用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 

【讨论】:

  • @ab for 循环并不是很优雅(恕我直言)。它通常很慢。尝试编辑。
  • 谢谢!它绝对有效。另一种解决方案是使用 sapply(上图)
【解决方案2】:

您可以对每个 A、B、C、... 使用一个简单的循环来做到这一点

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

【讨论】:

    【解决方案3】:

    用于创建顶级列表的示例数据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
    

    【讨论】:

      猜你喜欢
      • 2016-12-29
      • 2018-02-09
      • 2021-02-16
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多