我在使用 rename_with()
和 tidyselector any_of()
时遇到了困难,如果后者中没有匹配项。
看这个例子:
library(tidyvese)
iris |>
rename_with(.cols = any_of(contains("Length")),
.fn = ~ifelse(str_detect(.x, "Petal"),
paste0(.x, "_[petal_var]"),
paste0(.x, "_[sepal_var]")))
它的作用基本上是检查是否有包含字符串
"Length"
的变量,然后根据变量是否包含字符串"Petal"
应用函数:
是:则用
"_[petal_var]"
后缀重命名否:则用
"_[sepal_var]"
后缀重命名
但是只要至少有一个变量匹配any_of()
调用,此方法就有效。
让我们考虑一个没有匹配的示例:
iris |>
rename_with(.cols = any_of(contains("UNMATCHED_STRING")),
.fn = ~ifelse(str_detect(.x, "Petal"),
paste0(.x, "_[petal_var]"),
paste0(.x, "_[sepal_var]")))
这会返回:
Error in `rename_with()`:
! `.fn` must return a character vector, not an empty logical vector.
Run `rlang::last_error()` to see where the error occurred.
我理解这个问题:没有东西可以传递给.fn
参数,因为没有变量与tidyselect .col
步骤匹配。
不幸的是,我没有看到使用rename_with()
的解决方法(在这里非常需要)。在我更复杂的情况下,我需要将相当复杂的重命名函数传递给可能包含或不包含any_of(contains(...))
值的不同数据集。
任何帮助都将不胜感激。
rename_with()
的调用内忽略.fn
,如果没有匹配。如果没有更合适的方案,我会验证这个! - Michaël Weber