【发布时间】:2014-12-30 16:37:20
【问题描述】:
2020 年 7 月更新:
dplyr 1.0 几乎改变了这个问题的所有内容以及所有答案。在此处查看dplyr 编程小插曲:
https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html
当列的标识符存储为字符向量时,引用列的新方法是使用rlang 中的.data 代词,然后像在基本 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
如果您的代码在包函数中,您可以@importFrom rlang .data 避免 R 检查未定义全局变量的注释。
原始问题:
我想引用 summarise 中的未知列名。 dplyr 0.3 中引入的标准评估函数允许使用变量引用列名,但是当您在例如内部调用 base R 函数时,这似乎不起作用。 summarise。
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
select() 的 NSE 版本运行良好,因为它可以匹配字符串。 group_by() 的 SE 版本运行良好,因为它现在可以接受变量作为参数并评估它们。但是,在dplyr 函数中使用基本 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
【问题讨论】: