UPDATE July 2020:
dplyr
1.0几乎改变了这个问题以及所有答案的一切.请参见此处的dplyr
个编程小插曲:
https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html
当列的标识符被存储为字符向量时,引用列的新方法是使用rlang
中的.data
代词,然后使用base R中的子集.
library(dplyr)
key <- "v3"
val <- "v2"
drp <- "v1"
df <- tibble(v1 = 1:5, v2 = 6:10, v3 = c(rep("A", 3), rep("B", 2)))
df %>%
select(-matches(drp)) %>%
group_by(.data[[key]]) %>%
summarise(total = sum(.data[[val]], na.rm = TRUE))
#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 2 x 2
#> v3 total
#> <chr> <int>
#> 1 A 21
#> 2 B 19
如果你的代码在一个包函数中,你可以 Select @importFrom rlang .data
以避免R判断关于未定义全局变量的注释.
ORIGINAL QUESTION:
我想引用summarise
中的一个未知列名.dplyr 0.3
中引入的标准求值函数允许使用变量引用列名,但当您在例如summarise
中调用base
R函数时,这似乎不起作用.
library(dplyr)
key <- "v3"
val <- "v2"
drp <- "v1"
df <- data_frame(v1 = 1:5, v2 = 6:10, v3 = c(rep("A", 3), rep("B", 2)))
df如下所示:
> df
Source: local data frame [5 x 3]
v1 v2 v3
1 1 6 A
2 2 7 A
3 3 8 A
4 4 9 B
5 5 10 B
我想删除v1,按v3分组,并对每组的v2求和:
df %>% select(-matches(drp)) %>% group_by_(key) %>% summarise_(sum(val, na.rm = TRUE))
Error in sum(val, na.rm = TRUE) : invalid 'type' (character) of argument
NSE版本的select()
运行良好,因为它可以匹配字符串.group_by()
的SE版本运行良好,因为它现在可以接受变量作为参数并对其求值.然而,当在dplyr
个函数中使用base R函数时,我还没有找到一种实现类似结果的方法.
不起作用的事情:
df %>% group_by_(key) %>% summarise_(sum(get(val), na.rm = TRUE))
Error in get(val) : object 'v2' not found
df %>% group_by_(key) %>% summarise_(sum(eval(as.symbol(val)), na.rm = TRUE))
Error in eval(expr, envir, enclos) : object 'v2' not found