4

根据的文档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)

那么如何使用逆形式呢?我想将所有非数字值转换为字符,所以我想这样做:

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

但这不起作用。或者只选择所有非数字变量:

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

4

2 回答 2

5

~我们可以对匿名函数使用简写符号tidyverse

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

或者没有匿名函数,使用negatefrompurrr

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

除了negate, Negatefrombase 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
于 2020-02-09T20:38:25.780 回答
1

添加到他们的包中可能是一个很好的建议,所以请随时在 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(...))
于 2020-02-09T20:37:50.347 回答