Правильно использовать формулу 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))
Другие вопросы по тегам