Правильно использовать формулу rlang::as_function в аргументе.predicate для mutate_if
Я хотел бы использовать ~ . %% 1 == 0
формула в .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))
В настоящее время это приводит к следующей ошибке:
Ошибка в
.%%1
: нечисловой аргумент бинарного оператора
Фон
В документации dplyr::mutate_if
состояния:
.predicate Функция предиката, применяемая к столбцам или логическому вектору. Переменные, для которых.predicate равен или возвращает TRUE, выбраны. Этот аргумент передается
rlang::as_function()
и, таким образом, поддерживает лямбда-функции в стиле quosure и строки, представляющие имена функций.
Следовательно, формула ~ . %% 1 == 0
может использоваться следующим образом:
f_rlang_check <- rlang::as_function( ~ . %% 1 == 0)
f_rlang_check(c(1.1, 1))
[1] FALSE TRUE
Ясно, что формула верна; однако он не может быть напрямую передан rlang::as_function()
как показано выше.
dta %>%
mutate_if(.predicate = f_rlang_check,
.funs = funs(. + 10))
Выдает одинаковую ошибку
1 ответ
mutate_if
будет пытаться оценить функцию предиката для всех столбцов, поэтому вы получите ошибку при попытке использовать бинарный оператор %%
с нечисловым аргументом colA
, Вы можете исправить это с is.numeric
а также &&
,
Предикат должен возвращать одно логическое значение, поэтому вы можете использовать all
или же any
,
dta %>%
mutate_if(.predicate = ~ is.numeric(.) && all(. %% 1 == 0),
.funs = funs(. + 10))