在mutate_if

时间:2019-01-15 17:11:30

标签: r dplyr mutate rlang

我想通过以下方式在~ . %% 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

产生相同的错误

1 个答案:

答案 0 :(得分:1)

mutate_if会尝试不评估所有列的谓词函数,因此在尝试将二进制运算符%%与非数字参数colA一起使用时会出错。您可以使用is.numeric&&来解决此问题。

该谓词应返回一个逻辑值,因此您可能要使用allany

dta %>%
    mutate_if(.predicate = ~ is.numeric(.) && all(. %% 1 == 0),
              .funs = funs(. + 10))