Извлечение столбцов из списка самых привлекательных объектов - PullRequest
7 голосов
/ 15 июня 2011

Есть ли функция, которая может извлечь два или более столбца из объекта coeftest? Это простой один coeftest объект за раз, но можно ли сделать то же самое со списком (кроме цикла for())?

> # 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

Ответы [ 2 ]

12 голосов
/ 15 июня 2011

[[ - неправильная функция подмножества в этом случае.Обратите внимание, что когда вы lapply() над списком, то над чем вы работаете, являются компонентами списка, биты, которые вы получите с list[[i]], где i - это i-й компонент.вам нужен только [, 1:2] бит cts[[1]][, 1:2] в вызове lapply().Это немного сложнее из-за аргументов [, но легко выполнимо с 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].

5 голосов
/ 15 июня 2011

Я не уверен, что это то, что вы хотите, но как насчет:

> 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
...