2011-06-15 77 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