Правильно использовать формулу rlang :: as_function в аргументе .predicate для mutate_if - PullRequest
0 голосов
/ 15 января 2019

Я хотел бы использовать формулу ~ . %% 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 Ответ

0 голосов
/ 15 января 2019

mutate_if будет пытаться оценить функцию предиката для всех столбцов, поэтому вы получаете ошибку при попытке использовать двоичный оператор %% с нечисловым аргументом colA. Вы можете исправить это с помощью is.numeric и &&.

Предикат должен возвращать одно логическое значение, поэтому вы можете использовать all или any.

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