2011-06-15 334 views
8

是否有一個函數可以從coeftest對象中提取兩個或多個列?一次只能容納一個coeftest對象,但是我可以對列表執行相同操作(除了for()循環外)嗎?從coeftest對象列表中提取列

> # meaningless data 
> temp <- data.frame(a = rnorm(100, mean = 5), b = rnorm(100, mean = 1), 
+     c = 1:100) 
> formulas <- list(a ~ b, a ~ c) 
> models <- lapply(formulas, lm, data = temp) 
> library(lmtest) 
> cts <- lapply(models, coeftest) 

> # easy to extract columns one object at a time 
> cts[[1]][, 1:2] 
       Estimate Std. Error 
(Intercept) 5.0314196 0.1333705 
b   -0.1039264 0.0987044 

> # but more difficult algorithmically 
> # either one column 
> lapply(cts, "[[", 1) 
[[1]] 
[1] 5.03142 

[[2]] 
[1] 5.312007 

> # or two 
> lapply(cts, "[[", 1:2) 
Error in FUN(X[[1L]], ...) : attempt to select more than one element 

也許更根本的問題是,如果有一種方法打開coeftest對象的肉到數據幀,這將讓我單獨提取柱,然後用mapply()。謝謝!

編輯:我想結束與第一和第二列的矩陣(或數據幀)。

[[1]] 
       Estimate Std. Error 
(Intercept) 5.0314196 0.1333705 
b   -0.1039264 0.0987044 

[[2]] 
       Estimate Std. Error 
(Intercept) 5.312007153 0.199485363 
c   -0.007378529 0.003429477 
+1

如果您提供期望的結果,可能會更容易回答。 – kohske 2011-06-15 15:11:11

+0

@kohske - 好的電話。謝謝。 – 2011-06-15 15:53:58

回答

12

[[在這種情況下錯誤的子功能。請注意,當您在列表上操作lapply()時,您正在操作的是列表的組件,您將使用list[[i]]獲得的位,其中i是第i個組件。

因此,您只需要在lapply()調用中的[, 1:2]cts[[1]][, 1:2]。這是一個有點棘手,因爲參數爲[,但容易可行與lapply()

> lapply(cts, `[`, , 1:2) 
[[1]] 
       Estimate Std. Error 
(Intercept) 4.926679544 0.1549482 
b   -0.001967657 0.1062437 

[[2]] 
       Estimate Std. Error 
(Intercept) 4.849041327 0.204342067 
c   0.001494454 0.003512972 

注意<space>,1:2前;這相當於[ , 1:2]

+0

謝謝!非常明確的解釋。 – 2011-06-15 15:58:33

5

我不知道這是否是你想要的,但如何:

> do.call("rbind", cts)[, 1:2] 
       Estimate Std. Error 
(Intercept) 4.8200993881 0.142381642 
b   -0.0421189130 0.092620363 
(Intercept) 4.7459340076 0.206372906 
c   0.0005770324 0.003547885 
+0

@Kohkse - 謝謝!正確回答一個不同的問題(我提供所需輸出的速度很慢),但這對於以後的工作很有用。 – 2011-06-15 15:57:42