【问题标题】:Use dplyr's _if() functions like mutate_if() with a negative predicate function使用 dplyr 的 _if() 函数,如 mutate_if() 和否定谓词函数
【发布时间】:2020-02-09 20:37:50
【问题描述】:

根据the documentation of the dplyr package

# 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

也不行。

如何将negationdplyr 函数一起使用,例如mutate_if()select_if()arrange_if()


编辑:这可能会在即将发布的 dplyr 1.0.0 中解决:NEWS.md

【问题讨论】:

    标签: r dplyr data-transform


    【解决方案1】:

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

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

    或者没有匿名函数,使用negate from purrr

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

    除了negate,来自base RNegate也可以使用

    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
    

    【讨论】:

    • 不错的选择,非常感谢!不过,select_if(!is.numeric) 会很好。我想我现在会选择Negate()
    【解决方案2】:

    将其添加到他们的包中可能是一个不错的建议,因此请随时在 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(...))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多