Я могу использовать оболочку vars()
внутри mutate_at
, чтобы выполнить мутацию переменных, имена которых находятся в символьном векторе:
library(tidyverse)
varnames <- c("mpg", "am")
mtcars.mod <- mtcars %>%
mutate_at(vars(varnames),
funs(as.factor(.)))
is.factor(mtcars.mod$mpg)
#> [1] TRUE
Но что, если я хочу добавить предикат / условие дляэти переменные, как я мог бы сделать с mutate_if
?Другими словами, я хочу выполнить мутацию переменных, которые (1) включены в varnames
и (2) удовлетворяют предикату, например !is.factor()
Моя попытка, которая не удалась:
mtcars.mod <- mtcars %>%
mutate_if(~ (names(.) %in% varnames & !is.factor(.)),
funs(as.factor(.)))
#> Error in selected[[i]] <- .p(.tbl[[vars[[i]]]], ...): replacement has length zero
Я подозреваю, что names(.)
может возвращать NULL здесь.