首页 文章

dplyr标准评估:summarise_与summed变量的变量名称

提问于
浏览
3

我经历了许多类似于我的问题,但只解决了我问题的一部分 . 我正在使用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()的不同内容,但似乎没有任何工作 .

1 回答

  • 4

    在仔细阅读了NSE插图并讨论了一些事情后,我发现如果你使用 .dots 参数并将 interp 工作放在列表中,你可以在 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
    

相关问题