将字符串作为参数传递给 R
Passing string as an argument in R
我想定期传入在代码中用作参数的字符串。对于上下文,我经常想要一个部分,我可以在其中传递过滤条件或假设,然后通过我的分析、绘图等进行处理,以使其更具交互性。
下面是一个简单的例子。我看过 eval/parse 解决方案,但它似乎使代码块不可读。有 better/cleaner/shorter 的方法吗?
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))
好吧,这只是 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
但我想我说明了你的问题。我认为你真正想做的就像上面的代码一样,即创建一个函数。
您可以对问题中的示例使用 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。
我推荐使用 group_by_at()
。它支持单个字符串或字符向量:
nms <- c("cyl", "am")
mtcars %>% group_by_at(nms)
我想定期传入在代码中用作参数的字符串。对于上下文,我经常想要一个部分,我可以在其中传递过滤条件或假设,然后通过我的分析、绘图等进行处理,以使其更具交互性。
下面是一个简单的例子。我看过 eval/parse 解决方案,但它似乎使代码块不可读。有 better/cleaner/shorter 的方法吗?
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))
好吧,这只是 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
但我想我说明了你的问题。我认为你真正想做的就像上面的代码一样,即创建一个函数。
您可以对问题中的示例使用 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。
我推荐使用 group_by_at()
。它支持单个字符串或字符向量:
nms <- c("cyl", "am")
mtcars %>% group_by_at(nms)