gpt4 book ai didi

r - 列名存储在字符串中时的整洁评估

转载 作者:行者123 更新时间:2023-12-04 12:18:48 25 4
gpt4 key购买 nike

我需要通过逻辑列(或更准确地说,通过其否定)过滤表,但列的名称可能会有所不同。当我事先知道他们的名字时很容易:

tb = tibble(
id = 1:4,
col1 = c(TRUE, TRUE, FALSE, FALSE),
col2 = c(TRUE, FALSE, TRUE, FALSE)
)

tb
## # A tibble: 4 x 3
## id col1 col2
## <int> <lgl> <lgl>
## 1 1 TRUE TRUE
## 2 2 TRUE FALSE
## 3 3 FALSE TRUE
## 4 4 FALSE FALSE

colname = quo(col1)

tb %>%
filter(!!colname) # rows where col1 is true
## # A tibble: 2 x 3
## id col1 col2
## <int> <lgl> <lgl>
## 1 1 TRUE TRUE
## 2 2 TRUE FALSE

tb %>%
filter(!(!!colname)) # rows where col1 is false
## # A tibble: 2 x 3
## id col1 col2
## <int> <lgl> <lgl>
## 1 3 FALSE TRUE
## 2 4 FALSE FALSE

colname = quo(col2)

tb %>%
filter(!!colname) # rows where col2 is true
## # A tibble: 2 x 3
## id col1 col2
## <int> <lgl> <lgl>
## 1 1 TRUE TRUE
## 2 3 FALSE TRUE

tb %>%
filter(!(!!colname)) # rows where col2 is false
## # A tibble: 2 x 3
## id col1 col2
## <int> <lgl> <lgl>
## 1 2 TRUE FALSE
## 2 4 FALSE FALSE

但是,当列名存储在字符串中时,我无法弄清楚如何做同样的事情。例如:
colname = "col1"
tb %>%
filter(!!colname)
## Error in filter_impl(.data, quo): Argument 2 filter condition does not evaluate to a logical vector

colname = quo("col1")
tb %>%
filter(!!colname)
## Error in filter_impl(.data, quo): Argument 2 filter condition does not evaluate to a logical vector

colname = quo(parse(text = "col1"))
tb %>%
filter(!!colname)
## Error in filter_impl(.data, quo): Argument 2 filter condition does not evaluate to a logical vector

那么问题来了,我该怎么做呢?

编辑:这不是 this question 的副本因为从那时起,使用 dplyr 进行非标准评估的首选方式发生了变化。所有以 _ 终止的函数现在都已弃用,现在推荐使用 tidy 评估框架。

最佳答案

我们可以使用 sym来自 rlang用于评估字符串

library(rlang)
library(dplyr)
colname <- "col1"

tb %>%
filter(!!sym(colname))
# A tibble: 2 x 3
# id col1 col2
# <int> <lgl> <lgl>
#1 1 TRUE TRUE
#2 2 TRUE FALSE

关于r - 列名存储在字符串中时的整洁评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45242787/

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