2020年7月更新:dplyr
1.0改变了有关此问题以及所有答案的几乎所有内容。在此处查看dplyr
编程小插图:
https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html
当列的标识符存储为字符 vector 时,引用列的新方法是使用.data
的rlang
代词,然后使用基数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/