我经历了许多类似于我的问题,但只解决了我问题的一部分。我正在使用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()的不同内容,但似乎没有任何效果。
答案 0 :(得分:4)
在对NSE插图进行了一段时间的研究和探究之后,如果您使用setNames
参数并放置summarise_
,我发现您可以在.dots
中使用interp
在列表中工作。
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