2020年7月更新:dplyr 1.0改变了有关此问题以及所有答案的几乎所有内容。在此处查看dplyr编程小插图:
https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html
当列的标识符存储为字符 vector 时,引用列的新方法是使用.datarlang代词,然后使用基数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中引入的标准评估函数允许使用变量来引用列名,但是当您在例如html中调用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
NSE版本的select()可以正常工作,因为它可以匹配字符串。 SE版group_by()可以正常工作,因为它现在可以接受变量作为参数并对其求值。但是,在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
我已经 checkout 了several related questions,但是到目前为止,没有任何提议的解决方案对我有用。

最佳答案

请注意,此答案不适用于dplyr >= 0.7.0,但不适用于以前的版本。



dplyr vignette on non-standard evalutation在这里很有帮助。检查“混合常量和变量”部分,您发现可以使用软件包interp中的函数lazyeval和“[u] se as.name,如果您有一个给出变量名的字符串”:

library(lazyeval)
df %>%
  select(-matches(drp)) %>%
  group_by_(key) %>%
  summarise_(sum_val = interp(~sum(var, na.rm = TRUE), var = as.name(val)))
#   v3 sum_val
# 1  A      21
# 2  B      19

关于r - dplyr中的标准评估:总结以字符串形式给出的变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26724124/

10-12 22:33