dplyr标准评估:使用变量名称对被求和变量进行汇总。

3

我看到很多类似的问题,但只解决了我的问题的一部分。我正在使用具有标准评估功能的dplyr来适应变量名称。这对于管道中的filter_和group_by_很好用。然而,对于summarize,我不能为我正在汇总的度量指定变量名称。下面的示例将使其更加清晰。

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(),但似乎没有什么效果。


也许可以像这个答案一样添加一个rename_步骤?它可能看起来像rename_(.dots = setNames("variable_name", paste0(metric,"_",run1))) - aosmith
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

我还没有完全理解答案,但它确实非常有效。非常感谢!我将不得不深入研究dplyr文档才能掌握它。 - Triamus
3
是我自己的问题还是dplyr SE真的很痛苦? - MySchizoBuddy
@MySchizoBuddy:我有同样的感觉。如果你不硬编码名称,本来很简单的事情就变得非常混乱。 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接