看起来这应该很容易,但我很难过。我已经使用dplyr
0.7获得了编程的粗略支持,但是我正在努力解决这个问题:如果我想要编程的变量是一个字符串,我如何编程dplyr
?
我正在抓取一个数据库,由于各种原因想要总结一个变量,我将知道它的位置而不是名称(我想要的东西总是所提供的表的第一列,但名称存储在该列中的变量将根据被刮取的数据库而变化。以iris
为例,假设我知道我想要的变量在第一列
library(tidyverse)
desired_var <- colnames(iris)[1]
print(desired_var)
"Sepal.Length"
我现在想要按Species
进行分组,并取desired_var
的平均值,即我想要执行的内容
iris %>%
group_by(Species) %>%
summarise(desired_mean = mean(Sepal.Length))
但是,现在我想取一个由desired_var
我知道如何使用&#34;裸&#34; Sepal.Length
desired_var <- quo(Sepal.Length)
iris %>%
group_by(Species) %>%
summarise(desired_mean = mean(!!desired_var))
但是我如何处理这个事实:"Sepal.Length"
而不是Sepal.Length
,即desired_var <- "Sepal.Length"
?
答案 0 :(得分:3)
您想知道tidyeval
这是tidyverse
(参见here)的一个相当新的功能,更多用于使用tidyverse
函数创建函数。目前它只适用于dplyr
,但计划是将其扩展到其他tidyverse
个包。
根据您的需要,当summarize_at
完成时,您并不需要深入了解它。此功能允许您在您选择的任何变量中扩展您指定的特定操作:
iris %>%
group_by(Species) %>%
summarise_at(vars(one_of("Sepal.Length", "Sepal.Width")), funs(desired_mean = mean))
# A tibble: 3 x 3
Species Sepal.Length_desired_mean Sepal.Width_desired_mean
<fctr> <dbl> <dbl>
1 setosa 5.006 3.428
2 versicolor 5.936 2.770
3 virginica 6.588 2.974
您可以将变量列表存储到矢量中,然后使用该矢量:
selected_vectors <- c("Sepal.Length", "Sepal.Width")
iris %>%
group_by(Species) %>%
summarise_at(vars(one_of(selected_vectors)), funs(desired_mean = mean))
答案 1 :(得分:2)
1)带有!! sym的动态变量使用sym
(或parse_expr
),如下所示:
library(dplyr)
library(rlang)
desired_var <- "Sepal.Length"
iris %>%
group_by(Species) %>%
summarise(desired_mean = mean(!!sym(desired_var))) %>%
ungroup
,并提供:
# A tibble: 3 x 2
Species desired_mean
<fctr> <dbl>
1 setosa 5.006
2 versicolor 5.936
3 virginica 6.588
2)summarise_at 正如@Phil在summarise
特定情况的评论中指出的那样,可以这样做而不使用任何rlang设施:
library(dplyr)
desired_var <- "Sepal.Length"
iris %>%
group_by(Species) %>%
summarise_at(desired_var, funs(mean)) %>%
ungroup
,并提供:
# A tibble: 3 x 2
Species Sepal.Length
<fctr> <dbl>
1 setosa 5.006
2 versicolor 5.936
3 virginica 6.588
3)带有!!的动态变量和名称如果你需要在(1)中动态设置名称,那么试试这个:
library(dplyr)
library(rlang)
desired_var <- "Sepal.Length"
desired_var_name <- paste("mean", desired_var, sep = "_")
iris %>%
group_by(Species) %>%
summarise(!!desired_var_name := mean(!!sym(desired_var))) %>%
ungroup
,并提供:
# A tibble: 3 x 2
Species mean_Sepal.Length
<fctr> <dbl>
1 setosa 5.006
2 versicolor 5.936
3 virginica 6.588