dplyr 标准评估:summarise_ 和求和变量的变量名

dplyr standard evaluation: summarise_ with variable name for summed variable

我遇到了很多与我类似的问题,但只解决了我问题的一部分。我正在使用带有标准评估的 dplyr 来容纳变量名。这适用于管道中的 filter_ 和 group_by_。但是,总而言之,我不能为要求和的指标指定变量名。举个例子就清楚了。

library(dplyr)
library(lazyeval)

# create data
a <- data.frame(
  x = c(2010, 2010, 2011, 2011, 2011),
  y_zm = c(rep(10, 5)),
  y_r2 = c(rep(20, 5)))

# define variable names
tag <- "2011"
metric <- "y"
run1 <- "zm"
run2 <- "r2"

# working example for a pipe with fixed variable name
a %>%
  filter_(~x == tag) %>%
  group_by_(tag) %>%
  summarise_(variable_name = interp(~sum(var, na.rm = T), 
                                    var = as.name(paste0(metric,"_",run1))))

# non-working example of what I want to do
a %>%
  filter_(~x == tag) %>%
  group_by_(tag) %>%
  summarise_(as.name(paste0(metric,"_",run1)) = 
               interp(~sum(var, na.rm = T), 
                      var = as.name(paste0(metric,"_",run1))))

我尝试了很多涉及 as.name() 或 interp() 的不同方法,但似乎没有任何效果。

仔细研究了 NSE 小插图并查看了一些东西后,我发现如果使用 .dots 参数并放置 [=15],则可以在 summarise_ 中使用 setNames =] 在列表中工作。

a %>%
    filter_(~x == tag) %>%
    group_by_(tag) %>%
    summarise_(.dots = setNames(list(interp(~sum(var, na.rm = TRUE),
                                            var = as.name(paste0(metric,"_",run1)))), 
                                                            paste0(metric,"_",run1)))

Source: local data frame [1 x 2]

  2011 y_zm
1 2011   30

您也可以添加一个 rename_ 步骤来做同样的事情。我认为这不太理想,因为它依赖于了解您在 summarise_ 中使用的名称。但是,如果您总是使用相同的名称,例如 variable_name,在某些情况下这似乎是一个可行的替代方案。

a %>%
    filter_(~x == tag) %>%
    group_by_(tag) %>%
    summarise_(variable_name = interp(~sum(var, na.rm = T), 
                                         var = as.name(paste0(metric,"_",run1)))) %>%
    rename_(.dots = setNames("variable_name", paste0(metric,"_",run1)))

Source: local data frame [1 x 2]

  2011 y_zm
1 2011   30