取dplyr

时间:2017-07-22 23:23:48

标签: r dplyr tidyverse

看起来这应该很容易,但我很难过。我已经使用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"

2 个答案:

答案 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