Я пытаюсь изучить функции карты purrr
, используя map2
для применения lm
.Используя подмножество набора данных mtcars
, я создаю фрейм данных с комбинациями имен переменных, например:
# Load libraries
library(dplyr)
library(purrr)
# Subset data
df <- mtcars %>% select(mpg:qsec)
# Get variable names
car_vars <- colnames(df)
# Create data frame of variable names
foo <- combn(car_vars, 2) %>% t %>% data.frame
# > head(foo)
# X1 X2
# 1 mpg cyl
# 2 mpg disp
# 3 mpg hp
# 4 mpg drat
# 5 mpg wt
# 6 mpg qsec
Далее, у меня есть функция, которая принимает имя двух переменных иподходит для линейной модели:
# Fit model
fit_lm <- function(c1, c2){
lm(paste(c1, c2, sep = "~"), data = df)
}
Я могу применить это к map2
примерно так:
# Fit all the models
map2(foo$X1, foo$X2, fit_lm)
, давая список lm
объектов, которые при печати выглядят примерно так:
# [[1]]
#
# Call:
# lm(formula = paste(c1, c2, sep = "~"), data = df)
#
# Coefficients:
# (Intercept) cyl
# 37.885 -2.876
Отлично!Теперь вот где я спотыкаюсь.Я хотел бы добавить эти lm
объекты в виде столбца в моем фрейме данных, чтобы у меня были имена переменных в той же строке, что и сама модель.Итак, я использую dplyr
mutate
с map2
.
# Not so successful
foo %>% mutate(mods = map2(X1, X2, fit_lm))
Полученный столбец mods
имеет класс NULL, а не lm
и выглядит как dput
lm
объект, в отличие от моей предыдущей (успешной) попытки.Понятно, что я неправильно понял, как работает map2
.Может кто-нибудь объяснить мою ошибку?