从列表的子元素中提取矩阵,并保留矩阵所在的子列表索引和列表索引

3

我是一个新手,想找一种优雅的方法来解决似乎很简单的问题。问题的背景如下:我在不断变化的时间段内为一组公司运行回归分析。我将每个回归的总结存储在一个列表的列表中。例如:

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

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

显然,我可以使用嵌套循环来完成此操作,但似乎必须有一种简单的方法来使用lapply、sapply等一步提取此矩阵。我在网上和这个博客中看到了类似的问题答案,但是没有能够正确地将它们适应到这个问题上。另一个问题是,结果中的某些条目是“Null”,这是因为特定公司在特定时间内数据不足以运行回归分析。

非常感谢您的帮助或指导。


你好,欢迎来到SO。由于您是新手,您可能想阅读网站的关于FAQ部分,以帮助您更好地使用它。 - Simon O'Hanlon
3个回答

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))
  }
}

然后使用这些sigma创建新的矩阵:
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="")

the matrix looks as follows:

> 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语法。 - user2343447

1
另一种方式是:

或者:

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

非常感谢您的解决方案!我之前对simplify2array命令不熟悉。我也很感激大家的快速回应。 - user2343447

0

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

## 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)索引不对齐。 - user2343447

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接