将dplyr的_if()函数(如mutate_if())与负谓词函数一起使用

将dplyr的_if()函数(如mutate_if())与负谓词函数一起使用,r,dplyr,mutate,data-transform,R,Dplyr,Mutate,Data Transform,根据: 那么我如何使用逆形式呢?我想将所有非数字值转换为字符,因此我考虑执行以下操作: 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 typ

根据:

那么我如何使用逆形式呢?我想将所有非数字值转换为字符,因此我考虑执行以下操作:

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:中得到解决。

可能是一个很好的建议,可以添加到他们的包中,因此可以在GitHub上随意打开一个问题

现在,您可以“动态”编写函数:

iris %>% mutate_if(function(x) !is.numeric(x), as.character)
iris %>% select_if(function(x) !is.numeric(x))
这甚至可能更安全,但不确定“如果”内部如何工作:

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

我们可以在tidyverse中对匿名函数使用速记符号~

或者在没有匿名函数的情况下,使用purrr中的否定

除了否定外,从R开始的否定也起作用

iris %>%
   mutate_if(Negate(is.numeric), as.character)
相同的表示法,适用于select_if/arrange_if


非常好的选择,非常感谢!尽管如此,选择_if!是的,那就好了。我想我现在会选择否定。
library(dplyr)
iris %>% 
     mutate_if(~ !is.numeric(.), as.character)
library(purrr)
iris %>%
     mutate_if(negate(is.numeric), as.character)
iris %>%
   mutate_if(Negate(is.numeric), as.character)
iris %>%
     select_if(negate(is.numeric))%>%
     head(2)
#  Species
#1  setosa
#2  setosa