我正在尝试使用
给出一个打印时类似于以下内容的
map2
应用lm
来学习purrr
的映射函数。 我使用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
,看起来有点像lm
对象的dput
结果,与我之前(成功)尝试的不同。显然,我误解了map2
的工作原理。可以有人解释一下我的错误吗?
foo
需要是一个tibble
? - Dan