使用地图遍历多个变量以在嵌套数据集中回归

时间:2019-09-25 16:55:51

标签: r purrr

  • 我有一个嵌套的数据集,其中每一行在一列中包含一个带有主数据集子集的小标题。
  • 我想对这些子集中的每个子集进行回归分析,在这里我要改变因变量。
  • 我构建了一个函数,仅使用一个变量作为因变量。
  • 我正在尝试使用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 

1 个答案:

答案 0 :(得分:0)

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