gpt4 book ai didi

r - 关于在 `where()` 中使用 `dplyr::across()` 的警告以及使用时的错误

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

我是 R 初学者,我正在尝试清理 Excel 电子表格中的数据。我读过 dplyr::across()所以我试图在 mutate 中使用它管道。
我需要将一些被错误导入的列转换为 character --这些是整数,但我认为可能偶尔会出现拼写错误,例如令人困惑的额外空格 readxl::readxlsx() .
我正在尝试运行以下代码,该代码确实有效,但会从 dplyr 生成警告:

library(dplyr, warn.conflicts = FALSE)


# Copy built-in DF
my_iris <- iris

# Make random character vectors
rand_string1 <- sample(LETTERS, size = nrow(iris), replace = TRUE)
rand_string2 <- as.character(
sample(100, size = nrow(iris), replace = TRUE)
)

# Fill new character columns in the DF. The second one is supposed to be casted
# to int
my_iris$A_rand_char <- rand_string1
my_iris$B_rand_char <- rand_string2

# Mutate: select all char columns **except** the ones whose name matches the
# regex, and make them numeric. In the example, only new_iris$B_rand_char should
# be affected
mutated_iris <- my_iris %>%
mutate(
# Get all char variables except 'A_rand_char' (see below) and ID code
across(
is.character & !matches('A_rand'),
as.numeric
),
)

# Old data
class(my_iris$A_rand_char)
#> [1] "character"

class(my_iris$B_rand_char)
#> [1] "character"


# New data
# Old character column(s) still character:
class(mutated_iris$A_rand_char)
#> [1] "character"

# Column(s) converted to numeric:
class(mutated_iris$B_rand_char)
#> [1] "numeric"
这完成了转换字符列的工作,除了我通过 !matches(reg_exp_string) 明确排除的那些列之外。 ,但是 dplyr警告我应该将我的选择“谓词函数”包装在 where() 中.
我的问题是,当我这样做时,我得到一个错误。为简洁起见,如果我只包装 is.character &…上面一行 where()打电话,我得到:
Error: Problem with `mutate()` input `..1`.
x operations are possible only for numeric, logical or complex types
ℹ Input `..1` is `across(where(is.character & !matches("A_rand")), as.numeric)`.
我想这是错误的,因为我传递的函数与 !matches("A_rand") 的返回值相交.但同样,当我使用 purrr 时-style 语法,按照 where() 中的最后一个示例的文档:
     where(~ is.character(.x) && !matches('A_rand'))
我得到:
Error: Problem with `mutate()` input `..1`.
x `where()` must be used with functions that return `TRUE` or `FALSE`.
ℹ Input `..1` is `across(where(~is.character(.x) && !matches(.x, "A_rand")), as.numeric)`.
所以现在问题似乎是这两个函数返回的东西与 bool 向量不同,我被卡住了,因为我真的认为这是他们应该做的——尤其是 matches() ,在文档中被归类为选择助手。
同样,代码的第一个版本确实有效,但会生成某种弃用警告。
什么是更多 tidyverse - 选择除名称与正则表达式匹配的字符列之外的所有字符列的正确方法?
感谢任何可以做出贡献的人……

最佳答案

您只需要包装 is.characterwhere这是因为 is.character是谓词函数,而 where()是一个选择助手。您需要包装 is.characterwhere因为它不是选择助手。
这是您需要的代码:

mutated_iris <- my_iris %>%
mutate(
# Get all char variables except 'A_rand_char' (see below) and ID code
across(
where(is.character) & !matches('A_rand'),
as.numeric
),
)
选择助手严格用于 dplyr 内动词,如下面的错误所示。

require(dplyr)
base::is.character("hi")
#> [1] TRUE

try(tidyr::matches("hi"))
#> Error : `matches()` must be used within a *selecting* function.
#> i See <https://tidyselect.r-lib.org/reference/faq-selection-context.html>.

try(where(is.character("hi")))
#> Error in where(is.character("hi")) : could not find function "where"

tibble(a = character()) %>%
mutate(across(where(is.character), rev))
#> # A tibble: 0 x 1
#> # ... with 1 variable: a <chr>
创建于 2021-01-24 由 reprex package (v0.3.0)

关于r - 关于在 `where()` 中使用 `dplyr::across()` 的警告以及使用时的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65870063/

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