Tunnel data-variables through env-variable with “{{” operator

夙愿已清 提交于 2020-04-11 08:52:11

问题


Following the example from https://www.tidyverse.org/blog/2020/02/glue-strings-and-tidy-eval/

How do you pass variables into this function?

library(tidyverse)
#> Warning: package 'tidyverse' was built under R version 3.6.2
#> Warning: package 'tidyr' was built under R version 3.6.2

mean_by <- function(data, by, var, prefix = "avg") {
  data %>%
    group_by({{ by }}) %>%
    summarise("{prefix}_{{ var }}" := mean({{ var }}, na.rm = TRUE))
}

mean_by(mtcars, by = cyl, var = mpg, prefix = "avg")
#> # A tibble: 3 x 2
#>     cyl avg_mpg
#>   <dbl>   <dbl>
#> 1     4    26.7
#> 2     6    19.7
#> 3     8    15.1

# Variables to pass into function
params <-  setdiff(colnames(mtcars) ,"mpg") 

# How do you pass a variables into this function? 
purrr::map(params, mean_by(mtcars, by = .x, var = mpg, prefix = "avg"))
#> Error: Column `.x` is unknown

Created on 2020-02-19 by the reprex package (v0.3.0)


回答1:


Use the .data pronoun with the column name:

purrr::map(params, ~ mean_by(mtcars, by = .data[[.x]], var = mpg, prefix = "avg"))



回答2:


We could use ensym as the params passed are strings. So, either convert to symbol with ensym

library(dplyr)
library(purrr)
library(stringr)
mean_by <- function(data, by, var, prefix = "avg") {

 by <- rlang::ensym(by)
 var <- rlang::ensym(var)
 data %>%
    group_by(!! by) %>%
    summarise(!!str_c(prefix, var, sep="_")  := mean(!!var, na.rm = TRUE))
  }

mean_by(mtcars, by = cyl, var = "mpg", prefix = "avg")
# A tibble: 3 x 2
#    cyl avg_mpg
#  <dbl>   <dbl>
#1     4    26.7
#2     6    19.7
#3     8    15.1


map(params, ~mean_by(mtcars, by = !!.x, var = "mpg", prefix = "avg"))
#[[1]]
# A tibble: 3 x 2
#    cyl avg_mpg
#  <dbl>   <dbl>
#1     4    26.7
#2     6    19.7
#3     8    15.1

#[[2]]
# A tibble: 27 x 2
#    disp avg_mpg
#   <dbl>   <dbl>
# 1  71.1    33.9
# 2  75.7    30.4
# 3  78.7    32.4
# 4  79      27.3
# 5  95.1    30.4
# 6 108      22.8
# ...


来源:https://stackoverflow.com/questions/60305159/tunnel-data-variables-through-env-variable-with-operator

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!