2013-05-02 151 views
3

r是新手,希望找到解决看似简单问题的优雅方法。问题的背景如下:我在一段时间内对一组公司进行回归分析。我将每个回归的摘要存储在一个列表中。因此,举例来说:从列表子元素列表中提取矩阵,保留矩阵的列表/子列表索引

results[[i]][[t]] = summary(lm(y~x)),其中yx是公司i相关向量在时间t。我想从results萃取,如sigma矩阵使得:

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

显然,我可以用嵌套循环做到这一点,但它似乎必须有一步到位的东西,如lapply提取此矩阵的简单方法,sapply等等。我在整个网络和这个博客中都看到了类似的问题,但是还没有能够正确地适应这个问题。另一个扭曲是结果中的一些条目是'空',当特定公司在特定时间没有足够的数据来运行回归时发生。

任何帮助或方向将不胜感激。

+0

嗨,欢迎SO。由于您是新手,因此您可能需要阅读[** about **](http://stackoverflow.com/about)和[** FAQ **](http://stackoverflow.com/faq)部分的网站,以帮助您充分利用它。 – 2013-05-02 21:50:07

回答

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 <- 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 
+0

为可重复的数据+1和很好的答案 – 2013-05-02 16:42:25

+0

谢谢,这工作像一个魅力,非常快。我想我终于得到了lapply语法。 – user2343447 2013-05-02 18:39:27

1

或者另一种方式:

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

非常感谢您的解决方案!我并不熟悉simplify2array命令。我也很感激人们回应的速度。 – user2343447 2013-05-02 18:46:29

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 
+0

非常感谢!快速的说明,我发现第二种解决方案比第一种解决方案更稳健,因为它将“空”条目正确地传递给矩阵。第一种方法不会以相同的方式处理“空”条目,似乎会丢弃它们,这会使结果与原始(i,t)指数相对错位。 – user2343447 2013-05-02 19:00:00