2013-05-02 131 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