gpt4 book ai didi

r - 为什么 quosures 在 group_by() 中起作用,但在 filter() 中不起作用?

转载 作者:行者123 更新时间:2023-12-02 03:28:30 24 4
gpt4 key购买 nike

我正在构建一个函数,我将根据字符串操作数据框。在该函数中,我将根据字符串构建一个列名称,并使用它来操作数据框,如下所示:

library(dplyr)

orig_df <- data_frame(
id = 1:3
, amt = c(100, 200, 300)
, anyA = c(T,F,T)
, othercol = c(F,F,T)
)


summarize_my_df_broken <- function(df, my_string) {

my_column <- quo(paste0("any", my_string))

df %>%
filter(!!my_column) %>%
group_by(othercol) %>%
summarize(
n = n()
, total = sum(amt)
) %>%
# I need the original string as new column which is why I can't
# pass in just the column name
mutate(stringid = my_string)


}


summarize_my_df_works <- function(df, my_string) {

my_column <- quo(paste0("any", my_string))

df %>%
group_by(!!my_column, othercol) %>%
summarize(
n = n()
, total = sum(amt)
) %>%
mutate(stringid = my_string)

}

# throws an error:
# Argument 2 filter condition does not evaluate to a logical vector
summarize_my_df_broken(orig_df, "A")

# works just fine
summarize_my_df_works(orig_df, "A")

我明白问题是什么:在损坏的版本中取消引用 quosure 作为 filter() 的参数并没有引用实际的列 anyA。

我不明白的是为什么它在 summarize() 中有效,但在 filter() 中无效 - 为什么有区别?

最佳答案

现在您正在对字符串进行排序,而不是符号名称。那不是应该如何使用它们。 quo("hello")quo(hello) 之间有很大区别。如果您想从字符串中生成正确的符号名称,则需要使用 rlang::sym 。所以一个快速解决办法是

summarize_my_df_broken <- function(df, my_string) {

my_column <- rlang::sym(paste0("any", my_string))
...
}

如果你仔细观察,我想你会发现group_by/summarize实际上并没有按照你期望的方式工作(尽管你只是没有得到相同的错误消息)。这两个不会产生相同的结果

summarize_my_df_works(orig_df, "A")
# `paste0("any", my_string)` othercol n total
# <chr> <lgl> <int> <dbl>
# 1 anyA FALSE 2 300
# 2 anyA TRUE 1 300

orig_df %>%
group_by(anyA, othercol) %>%
summarize(
n = n()
, total = sum(amt)
) %>%
mutate(stringid = "A")
# anyA othercol n total stringid
# <lgl> <lgl> <int> <dbl> <chr>
# 1 FALSE FALSE 1 200 A
# 2 TRUE FALSE 1 100 A
# 3 TRUE TRUE 1 300 A

问题又出在使用字符串而不是符号。

关于r - 为什么 quosures 在 group_by() 中起作用,但在 filter() 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46713002/

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