簡體   English   中英

使用帶有否定謂詞函數的 dplyr 的 _if() 函數,例如 mutate_if()

[英]Use dplyr's _if() functions like mutate_if() with a negative predicate function

根據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

也不行。

如何對mutate_if()select_if()arrange_if()dplyr函數使用否定


編輯:這可能會在即將發布的 dplyr 1.0.0: NEWS.md

我們可以使用速記符號~用於tidyverse匿名函數

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

或者沒有匿名函數,使用negatepurrr

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

除了negate ,來自base R Negate也有效

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

添加到他們的包中可能是一個很好的建議,所以請隨時在 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(...))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM