Используйте карту, чтобы перебрать несколько переменных для регрессии во вложенном наборе данных - PullRequest
1 голос
/ 25 сентября 2019
  • У меня есть вложенный набор данных, где каждая строка содержит столбец с подмножеством основного набора данных.
  • Я хочу запустить регрессии для каждого из этих подмножеств, где я изменяю зависимую переменную.
  • Я создал функцию для этого, взяв только одну переменную в качестве зависимой переменной.
  • Я пытаюсь использовать карту для зацикливания нескольких возможных зависимых переменных, но похоже, что формула неправильно интерпретируется.
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 голосов
/ 25 сентября 2019

Мы можем преобразовать в символ с 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>  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...