【问题标题】:Accessing same named list elements of the list of lists in R访问R中列表列表的相同命名列表元素
【发布时间】:2011-05-09 10:37:07
【问题描述】:

我经常遇到需要为不同变量创建大量相似模型的情况。通常我将它们转储到列表中。以下是虚拟代码示例:

modlist <- lapply(1:10,function(l) {
   data <- data.frame(Y=rnorm(10),X=rnorm(10))
   lm(Y~.,data=data)
})

例如,现在很容易适应:

lapply(modlist,predict)

有时我想做的是从列表中提取一个元素。显而易见的方法是

sapply(modlist,function(l)l$rank)

这是我想要的,但我想知道是否有更短的方法来获得相同的结果?

【问题讨论】:

  • 您的示例代码在使用 foreach 包时返回错误。
  • @Joris,这是一个伪代码,原则上它不应该工作,因为simulate 没有定义。但是大写的C 出现错误。感谢您指出。
  • 我明白了。但是,人们会假设您的虚拟代码运行,并且一个最小的可重现示例通常是为了说明问题而付出的一点努力。它避免了我们不得不自己寻找答案。
  • @Joris,现在代码应该可以运行了。我不知道为什么我觉得在这种情况下不需要工作代码。代码应该始终有效,无论是虚拟的还是非虚拟的。

标签: r


【解决方案1】:

可能这些有点简单:

> z <- list(list(a=1, b=2), list(a=3, b=4))
> sapply(z, `[[`, "b")
[1] 2 4
> sapply(z, get, x="b")
[1] 2 4

您可以定义如下函数:

> `%c%` <- function(x, n)sapply(x, `[[`, n)
> z %c% "b"
[1] 2 4

而且这看起来像是$的扩展:

> `%$%` <- function(x, n) sapply(x, `[[`, as.character(as.list(match.call())$n))
> z%$%b
[1] 2 4

【讨论】:

  • 谢谢,我认为这样的事情应该是可能的。很遗憾我不能同时接受这两个答案,我选择@Marek 的答案纯粹是出于审美原因。我赞成你的。
【解决方案2】:

我通常使用kohske way,但这里还有一个技巧:

 sapply(modlist, with, rank)

当你需要更多元素时它更有用,例如:

 sapply(modlist, with, c(rank, df.residual))

我记得我是从 hadley 那里偷来的(我想是从 plyr 文档中偷来的)。

[[with 解决方案之间的主要区别在于是否缺少元素。 [[ 在缺少元素时返回 NULLwith 抛出错误除非全局工作区中存在与搜索元素同名的对象。例如:

dah <- 1
lapply(modlist, with, dah)

modlist 没有任何dah 元素时返回列表。

【讨论】:

  • 谢谢,这确实感觉像@hadley 代码,简单而优雅。
  • @mpiktas "[["with 解决方案之间的主要区别是在缺少元素的情况下。 "[[" 在缺少元素时返回 NULLwith 抛出错误除非全局工作空间中存在与搜索元素同名的对象。所以例如当modlist 没有任何dah 元素时,dah&lt;-1;lapply(modlist, with, dah) 返回列表。
  • 感谢您的补充评论。就我而言,列表中的元素不应缺少任何元素,因此欢迎出错。
【解决方案3】:

使用 Hadley 的新 lowliner 包,您可以为 map() 提供数字索引或元素名称,以优雅地从列表中提取组件。 map() 相当于 lapply() 有一些额外的技巧。

library("lowliner")

l <- list(
  list(a = 1, b = 2),
  list(a = 3, b = 4)
)

map(l, "b")
map(l, 2)

还有一个将结果简化为向量的版本

map_v(l, "a")
map_v(l, 1)

【讨论】:

  • 更新:lowliner 现在是 purrr 包。 map_v 已被弃用。但是您可以使用 map(l, "a") %&gt;% as_vector() 简化为向量
猜你喜欢
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 2022-07-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多