gpt4 book ai didi

r - dplyr : summarise a variable given as a character string 中的标准评估

转载 作者:行者123 更新时间:2023-12-03 06:09:41 25 4
gpt4 key购买 nike

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 函数时,这似乎不起作用。 总结

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、group by v3 和 sum 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 版本工作正常,因为它可以匹配字符串。 SE 版本的 group_by() 工作正常,因为它现在可以接受变量作为参数并对其求值。但是,在 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

我已经查看了several related questions ,但到目前为止,所提出的解决方案都没有为我工作。

最佳答案

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

[dplyr 0.7.0] has a new approach to non-standard evaluation (NSE) called tidyeval. It is described in detail in vignette("programming").

<小时/>

dplyr vignette on non-standard evalutation在这里很有帮助。检查“混合常量和变量”部分,您会发现可以使用包lazyeval中的函数interp,并且“[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 : summarise a variable given as a character string 中的标准评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26724124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com