在R中将字符串作为参数传递

时间:2019-02-24 20:02:49

标签: r dplyr rlang tidyeval

在相当定期的基础上,我想传入在代码中用作参数的字符串。对于上下文,我经常需要一个区域,在该区域中我可以传递过滤条件或假设,然后再进行分析,绘图等,以使其更具交互性。

下面是一个简单的示例。我已经看到了eval / parse解决方案,但似乎使代码块不可读。有更好/更清洁/更短的方法来做到这一点吗?

column.names <- c("group1", "group2") #two column names I want to be able to toggle between for grouping
select.column <- group.options[1] #Select the column for grouping

DataTable.summary <- 
  DataTable %>% 
  group_by(select.column) %>% #How do I pass that selection in here? 
  summarize(avg.price = mean(SALES.PRICE))

3 个答案:

答案 0 :(得分:3)

这只是tidyverse网站上的复制粘贴:link:(https://dplyr.tidyverse.org/articles/programming.html#programming-recipes)。

my_summarise <- function(df, group_var) {
  group_var <- enquo(group_var)
  print(group_var)
  df %>%
    group_by(!! group_var) %>%
    summarise(a = mean(a))
}
my_summarise(df, g1)
#> <quosure>
#> expr: ^g1
#> env:  global
#> # A tibble: 2 x 2
#>      g1     a
#>   <dbl> <dbl>
#> 1     1  2.5 
#> 2     2  3.33

但是我想我可以说明您的问题。我认为您真正想要做的就是上面的代码,即创建一个函数。

答案 1 :(得分:3)

对于问题中的示例,您可以使用group_by_函数:

library(dplyr)

x <- data.frame(group1 = letters[1:4], group2 = LETTERS[1:4], value = 1:4)
select.colums <- c("group1", "group2")

x %>% group_by_(select.colums[2]) %>% summarize(avg = mean(value))
# A tibble: 4 x 2
#  group2   avg
#  <fct>  <dbl>
# 1 A          1
# 2 B          2
# 3 C          3
# 4 D          4

dplyr中的*_系列功能可能还会为您提供更通用的解决方案,尽管dplyr文档说它们已被弃用(?group_by_),并可能在某个时候消失。使用整洁的评估语法,与上述解决方案的类似表达似乎是:

x %>% group_by(!!sym(select.colums[2])) %>% summarize(avg = mean(value))

还有几列:

x %>% group_by(!!!syms(select.colums)) %>% summarize(avg = mean(value))

这将创建一个由dplyr评估的symbol out of a string

答案 2 :(得分:2)

我建议使用group_by_at()。它支持单个字符串或字符向量:

nms <- c("cyl", "am")

mtcars %>% group_by_at(nms)