map() 在每个列表项中创建一个新列

map() to create a new column inside each list item

我有一个 lm() 模型输出列表,例如(下面的可重现示例):

library(tidyverse)
mtcars
model1 <- lm(mpg ~ disp, data = mtcars)
model2 <- lm(mpg ~ disp + hp, data = mtcars)
models <- list(model1, model2)
models

给出的列表如下所示:

[[1]]

Call:
lm(formula = mpg ~ disp, data = mtcars)

Coefficients:
(Intercept)         disp  
   29.59985     -0.04122  


[[2]]

Call:
lm(formula = mpg ~ disp + hp, data = mtcars)

Coefficients:
(Intercept)         disp           hp  
   30.73590     -0.03035     -0.02484 

我可以在列表中的所有模型上使用 map() 到 运行 函数(例如 AIC()),例如:

map(.x = models, .f = AIC)

每个模型的 returns 个值:

[[1]]
[1] 170.2094

[[2]]
[1] 168.6186

如何获取上面的输出(即 AIC() 函数的输出)并使用它在每个列表项中创建一个新列(即为每个模型创建一个新的 AIC() 输出列) ?

本质上,我正在尝试执行下面的代码,但使用 map():

model1$AIC <- AIC(model1)
model2$AIC <- AIC(model2)

首选是 tidyverse map() 解决方案,但我会对任何其他解决方案感到满意。

我们可以使用map

new_model <- purrr::map(models, ~{.x$AIC = AIC(.x);.x})

new_model[[1]]$AIC
#[1] 170.2094

new_model[[2]]$AIC
#[1] 168.6186

同样,我们也可以使用lapply

new_model <- lapply(models, function(x) {x$AIC = AIC(x);x})

我们可以直接应用 AIC

library(purrr)
map_dbl(models, AIC)
#[1] 170.2094 168.6186

如果我们需要更新 'models'

for(i in seq_along(models)) models[[i]][['AIC']] <- AIC(models[[i]])