首页 > 解决方案 > 使用 map 循环多个变量以在嵌套数据集中回归

问题描述

library(purrr)
library(tidyr)
library(rlang)

reg_across_groups <- function(df, var) {

  df <- df %>% 
    nest(data = -c("cyl"))

  var_enq <- rlang::enquo(var)

  model_formula <- formula(paste0(rlang::quo_name(var_enq), "~  hp"))

  df %>% 
    dplyr::mutate(model = purrr::map(data, ~lm(model_formula, data = .x)))
}

# Works
reg_across_groups(mtcars, mpg)
reg_across_groups(mtcars, "mpg")

# Does not work
c("mpg", "wt") %>% 
  map(~ reg_across_groups(mtcars, .))

我收到以下错误消息:

Error in eval(predvars, data, env) : object '.' not found 

标签: rpurrr

解决方案


我们可以转换为符号ensym

library(dplyr)
library(tidyr)
library(purrr)
 reg_across_groups <- function(df, var) {
  var <- ensym(var)
  df <- df %>% 
    nest(data = -c("cyl"))



  model_formula <- formula(paste0(var, "~  hp"))

  df %>% 
    dplyr::mutate(model = purrr::map(data, ~lm(model_formula, data = .x)))
}





c("mpg", "wt") %>% 
   map(~ reg_across_groups(mtcars, !!.x))
#[[1]]
# A tibble: 3 x 3
#    cyl            data model 
#  <dbl> <list<df[,10]>> <list>
#1     6        [7 × 10] <lm>  
#2     4       [11 × 10] <lm>  
#3     8       [14 × 10] <lm>  

#[[2]]
# A tibble: 3 x 3
#    cyl            data model 
#  <dbl> <list<df[,10]>> <list>
#1     6        [7 × 10] <lm>  
#2     4       [11 × 10] <lm>  
#3     8       [14 × 10] <lm>  



reg_across_groups(mtcars, mpg)
# A tibble: 3 x 3
#    cyl            data model 
#  <dbl> <list<df[,10]>> <list>
#1     6        [7 × 10] <lm>  
#2     4       [11 × 10] <lm>  
#3     8       [14 × 10] <lm>  

reg_across_groups(mtcars, "mpg")
# A tibble: 3 x 3
#    cyl            data model 
#  <dbl> <list<df[,10]>> <list>
#1     6        [7 × 10] <lm>  
#2     4       [11 × 10] <lm>  
#3     8       [14 × 10] <lm>  

推荐阅读