访问R中列表列表的相同命名列表元素

mpi*_*tas 12 r

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

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

现在,以实例为例非常简单:

lapply(modlist,predict)
Run Code Online (Sandbox Code Playgroud)

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

sapply(modlist,function(l)l$rank)
Run Code Online (Sandbox Code Playgroud)

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

koh*_*ske 27

可能这些有点简单:

> 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
Run Code Online (Sandbox Code Playgroud)

你可以定义一个函数:

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

而这看起来像是一个扩展$:

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


Mar*_*rek 19

我通常使用kohske方式,但这是另一个技巧:

 sapply(modlist, with, rank)
Run Code Online (Sandbox Code Playgroud)

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

 sapply(modlist, with, c(rank, df.residual))
Run Code Online (Sandbox Code Playgroud)

我记得我从hadley那里偷了它(我认为是plyr文档).

  • 谢谢,这肯定感觉像@hadley代码,简单而优雅. (2认同)