【问题标题】:Extracting matrices from list of list sub-elements keeping the list/sub-list indices for the matrix从列表子元素列表中提取矩阵,保留矩阵的列表/子列表索引
【发布时间】:2013-05-02 16:10:08
【问题描述】:

r 新手,希望找到一种优雅的方法来解决看似简单的问题。问题的背景如下:我在滚动时间段为一组公司运行回归。我将每个回归的摘要存储在列表列表中。所以,例如:

results[[i]][[t]] = summary(lm(y~x)),其中yx 是公司i 在时间t 的关联向量。我想从results 中提取像sigma 这样的矩阵:

sigma[i,t] = results [[i]] [[t]]$sigma

显然我可以用嵌套循环来做到这一点,但似乎必须有一种简单的方法来一步提取这个矩阵,比如 lapply、sapply 等。我在整个网络和这个博客上都看到了类似的问题,但无法正确地使它们适应这个问题。另一个转折是结果中的一些条目是“空”,当特定公司在特定时间没有足够的数据来运行回归时,就会发生这种情况。

任何帮助或指导将不胜感激。

【问题讨论】:

  • 嗨,欢迎来到 SO。由于您是新来的,您可能需要阅读网站的 aboutFAQ 部分,以帮助您充分利用它。

标签: r list lapply sapply


【解决方案1】:

您可以使用lapplydo.call

首先创建一些示例数据:

results <- list()
for (i in 1:5){
  results[[i]] <- list()
  for (t in 1:3){
    x <- sample(10)
    y <- sample(10)
    results[[i]][[t]] <- summary(lm(x~y))
  }
}

然后使用 sigmas 创建新矩阵:

sigma <- do.call(rbind, lapply(results, function(x)lapply(x, function(y)y$sigma)))
colnames(sigma) <- paste("t", 1:ncol(sigma), sep="")
rownames(sigma) <- paste("c", 1:nrow(sigma), sep="")

矩阵如下:

> sigma
   t1       t2       t3      
c1 2.302831 3.201325 3.154122
c2 3.066436 3.179956 3.146427
c3 2.752409 3.189946 2.819306
c4 3.211249 3.210777 2.983795
c5 3.179956 3.179956 2.340034

【讨论】:

  • 谢谢,这很有魅力,而且速度非常快。我想我终于得到了 lapply 语法。
【解决方案2】:

或者其他方式:

sigma <- apply(simplify2array(results),1:2,function(v)v[[1]]$sigma)

【讨论】:

  • 非常感谢您的解决方案!我不熟悉 simple2array 命令。我也很欣赏人们的反应速度。
【解决方案3】:

还有另外几种方法,为什么不...

## seed used to generate data
set.seed(1)
sigs <- unlist(results)
sigma <- sigs[ names(sigs) %in% "sigma"]
sigma <- matrix(sigma , length( results ) )
#        [,1]     [,2]     [,3]
#[1,] 3.206527 2.797726 3.100342
#[2,] 3.208417 3.138230 3.138230
#[3,] 2.819306 3.138230 3.201325
#[4,] 3.179956 3.209833 3.194218
#[5,] 2.983795 2.652614 3.174233

感谢@user1981275 提供了一些可重现的数据。

时间以列为单位。

lapply 的一个变体是使用 sapply,因为它的返回值已经是您需要的形式:

t(sapply( results , function(x) sapply( x , function(y) y$sigma ) ) )
#        [,1]     [,2]     [,3]
#[1,] 3.206527 2.797726 3.100342
#[2,] 3.208417 3.138230 3.138230
#[3,] 2.819306 3.138230 3.201325
#[4,] 3.179956 3.209833 3.194218
#[5,] 2.983795 2.652614 3.174233

【讨论】:

  • 非常感谢!快速说明,我发现第二个解决方案比第一个解决方案更强大,因为它正确地将“Null”条目带到了矩阵中。第一种方法没有以相同的方式处理“Null”条目,并且似乎删除了它们,这使得结果相对于原始 (i,t) 索引未对齐。
猜你喜欢
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 2021-04-28
相关资源
最近更新 更多