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

时间:2019-09-14 08:04:27

标签: r tidyverse purrr lm

例如,我有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)

返回每个模型的值:

[[1]]
[1] 170.2094

[[2]]
[1] 168.6186

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

基本上,我正在尝试执行以下代码,但是使用map()

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

第一个优先选择的是整洁的map()解决方案,但我对其他任何解决方案都很满意。

2 个答案:

答案 0 :(得分:3)

我们可以使用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})

答案 1 :(得分:1)

我们可以直接直接应用self.countDownTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.countDownTime), userInfo: nil, repeats: true); func countDownTime() { let now = Date(); let calendar = Calendar.current; let comps = calendar.dateComponents(Set<Calendar.Component>([.minute, .second]), from: now, to: self.startTime); var strMinute = "\(comps.minute!)"; var strSecond = "\(comps.second!)"; if (comps.minute! < 10) { strMinute = "0\(comps.minute!)"; } if (comps.second! < 10) { strSecond = "0\(comps.second!)"; } if (comps.minute! <= 0 && comps.second! <= 0) { self.countDownTimer?.invalidate(); } else { self.lblCountDownTime.text = "\(strMinute):\(strSecond)\""; } }

AIC

如果我们需要更新“模型”

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