【问题标题】:using quosures within formula inside an anonymous function在匿名函数内的公式中使用 quosures
【发布时间】:2018-10-07 17:54:46
【问题描述】:

我正在尝试使用 quosures 在自定义函数中传递变量名称以进行数据处理并在公式中使用,但我在公式中使用 quosures 是不正确的。有没有更好的方法在公式中取消引用参数?

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))

【问题讨论】:

    标签: r purrr quosure


    【解决方案1】:

    您需要将基本 R 非标准评估与 lm 之类的函数一起使用,可以说它们不是“在 tidyverse 中”。

    因此您可以将内容更改为:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多