我想通过以下方式在~ . %% 1 == 0
的{{1}}参数中使用.predicate
公式:
mutate_if
其中dta %>%
mutate_if(.predicate = ~ . %% 1 == 0,
.funs = funs(. + 10))
对应于以下小标题:
dta
这当前会产生以下错误:
dta <- tibble(colA = c("a", "b"), colB = 1:2, colC = c(1.1, 2.2))
中的错误:二进制运算符的非数字参数
在dplyr::mutate_if
国的文档中:
.predicate 谓词功能要应用于列或 逻辑向量。 .predicate是或返回TRUE的变量 被选中。此参数传递给
rlang::as_function()
,因此 支持quosure风格的lambda函数和表示的字符串 函数名称。
因此,公式.%%1
可以按以下方式使用:
~ . %% 1 == 0
显然,这个公式是正确的;但是它不能直接传递到rlang::as_function()
,如上所示。
f_rlang_check <- rlang::as_function( ~ . %% 1 == 0)
f_rlang_check(c(1.1, 1))
[1] FALSE TRUE
产生相同的错误
答案 0 :(得分:1)
mutate_if
会尝试不评估所有列的谓词函数,因此在尝试将二进制运算符%%
与非数字参数colA
一起使用时会出错。您可以使用is.numeric
和&&
来解决此问题。
该谓词应返回一个逻辑值,因此您可能要使用all
或any
。
dta %>%
mutate_if(.predicate = ~ is.numeric(.) && all(. %% 1 == 0),
.funs = funs(. + 10))