Используйте функции diflyr _if (), такие как mutate_if () с функцией отрицательного предиката - PullRequest
3 голосов
/ 09 февраля 2020

В соответствии с документацией пакета dplyr :

# The _if() variants apply a predicate function (a function that
# returns TRUE or FALSE) to determine the relevant subset of
# columns.
# mutate_if() is particularly useful for transforming variables from
# one type to another
iris %>% mutate_if(is.factor, as.character)

Так как мне использовать обратную форму? Я хотел бы преобразовать все нечисловые значения c в символы, поэтому я подумал:

iris %>% mutate_if(!is.numeric, as.character)
#> Error in !is.numeric : invalid argument type

Но это не работает. Или просто выберите все переменные, которые не нумеруются c:

iris %>% select_if(!is.numeric)
#> Error in !is.numeric : invalid argument type

Также не работает.

Как использовать отрицание с dplyr функциями, такими как mutate_if(), select_if() и arrange_if()?


РЕДАКТИРОВАТЬ: Это может быть решена в следующем dplyr 1.0.0: NEWS.md.

Ответы [ 2 ]

3 голосов
/ 09 февраля 2020

Мы можем использовать сокращенную запись ~ для анонимной функции в tidyverse

library(dplyr)
iris %>% 
     mutate_if(~ !is.numeric(.), as.character)

Или без анонимной функции используйте negate из purrr

library(purrr)
iris %>%
     mutate_if(negate(is.numeric), as.character)

В дополнение к negate, Negate из base R также работает

iris %>%
   mutate_if(Negate(is.numeric), as.character)

То же обозначение, работает с select_if/arrange_if

iris %>%
     select_if(negate(is.numeric))%>%
     head(2)
#  Species
#1  setosa
#2  setosa
1 голос
/ 09 февраля 2020

Может быть хорошим предложением добавить к их пакету, поэтому не стесняйтесь открывать проблему на GitHub.

На данный момент вы можете написать функцию «на лету»:

iris %>% mutate_if(function(x) !is.numeric(x), as.character)
iris %>% select_if(function(x) !is.numeric(x))

И это может быть даже безопаснее, не знаю, как работают _if() внутренние устройства:

iris %>% mutate_if(function(...) !is.numeric(...), as.character)
iris %>% select_if(function(...) !is.numeric(...))
...