在相当定期的基础上,我想传入在代码中用作参数的字符串。对于上下文,我经常需要一个区域,在该区域中我可以传递过滤条件或假设,然后再进行分析,绘图等,以使其更具交互性。
下面是一个简单的示例。我已经看到了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))
答案 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)