использование кавычек в формуле внутри анонимной функции - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь использовать выражения для передачи имен переменных в пользовательской функции для обработки данных и использования в формуле, но мое использование выражений в формуле неверно. Есть ли лучший способ привести к кавычкам аргументы в формуле?

library(dplyr)
library(broom)
library(purrr)
library(tidyr)

foo <- function(mydata, dv, iv, group_var) {
  dv = enquo(dv)
  iv = enquo(iv)
  group_var = enquo(group_var)

  mydata <- mydata %>% 
    group_by(!!group_var) %>% 
    nest() 

  mydata %>% 
    mutate(model = map(data, 
      ~summary(lm(formula(substitute(dv ~ iv)), data = .))
    )) %>%         
    unnest(model %>% map(tidy))
}

foo(mydata=mtcars, dv=mpg, iv=wt, group_var=cyl)

Мой код выдает «Ошибка в mutate_impl (.data, dots): Ошибка оценки: объект не является матрицей.»

Это рабочая версия кода, который я пытаюсь превратить в функцию:

mtcars %>% 
  group_by(cyl) %>% 
  nest() %>% 
  mutate(model = map(data, ~summary(lm(mpg ~ wt, data = .)))) %>% 
  unnest(model %>% map(tidy))

1 Ответ

0 голосов
/ 27 апреля 2018

Вам необходимо использовать нестандартную оценку по основанию R с такими функциями, как lm, которые, так сказать, не находятся "в поле зрения".

Так что вы могли бы изменить вещи на:

foo <- function(mydata, dv, iv, group_var) {
  flma <- as.formula(paste(substitute(dv), "~", substitute(iv)))
  group_var = enquo(group_var)

  mydata <- mydata %>% 
    group_by(!!group_var) %>% 
    nest() 

  mydata %>% 
    mutate(model = map(data, ~summary(lm(flma, data = .)))) %>%         
    unnest(model %>% map(tidy))
}   

foo(mtcars, mpg, wt, cyl)

Хорошо, если вы знаете, что делаете только простую регрессию. Для большей гибкости просто передайте формулу напрямую, как в:

foo2 <- function(mydata, flma, group_var) {
  group_var = enquo(group_var)

  mydata <- mydata %>% 
    group_by(!!group_var) %>% 
    nest() 

  mydata %>% 
    mutate(model = map(data, ~summary(lm(flma, data = .)))) %>%         
    unnest(model %>% map(tidy))
}   

foo(mtcars, mpg ~ wt, cyl)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...