【问题标题】:Use map to loop over multiple variables to regress in nested dataset使用 map 循环多个变量以在嵌套数据集中回归
【发布时间】:2019-09-25 16:55:51
【问题描述】:
  • 我有一个嵌套数据集,其中每一行在一列中包含一个带有主数据集子集的小标题。
  • 我想对这些子集中的每一个运行回归,其中我改变了因变量。
  • 我构建了一个函数来执行此操作,仅将一个变量作为因变量。
  • 我正在尝试使用 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 

【问题讨论】:

  • 功能可以改吗?

标签: r purrr


【解决方案1】:

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

【讨论】:

  • 所以在这种情况下,地图可以工作,但不仅仅是不带引号的变量名,就像 tidyverse 函数的风格一样。这是一个合理的妥协。
  • @jyiow 你想同时通过吗?
  • 如果不是太复杂的话,两种方式都可以调用会更灵活。
猜你喜欢
  • 1970-01-01
  • 2021-03-11
  • 2020-12-09
  • 1970-01-01
  • 2013-08-19
  • 2019-05-22
  • 2020-10-31
  • 2012-12-27
  • 1970-01-01
相关资源
最近更新 更多