如何使用dplyr :: select_if选择非数字列

时间:2018-01-24 20:15:33

标签: r dplyr

我需要选择所有不是数字的列。我可以使用select_if轻松选择所有数字列:

mtcars %>% select_if(is.numeric)

如果我想选择non-numeric列,该怎么办?我试过了:

mtcars %>% select_if(!is.numeric)

但我收到以下错误消息:

Error in !is.numeric : invalid argument type

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:22)

如果您使用purrr而非negate()

,则可以使用library(tidyverse)的{​​{1}}
library(dplyr)

答案 1 :(得分:7)

如果你有一个合理的dplyr版本,你可以使用purrr风格的匿名函数:

library(dplyr)

iris %>% select_if(~!is.numeric(.x)) %>% head()
#>   Species
#> 1  setosa
#> 2  setosa
#> 3  setosa
#> 4  setosa
#> 5  setosa
#> 6  setosa

或旧式funs符号仍然有效,例如

iris %>% select_if(funs(!is.numeric(.))) %>% head()
#>   Species
#> 1  setosa
#> 2  setosa
#> 3  setosa
#> 4  setosa
#> 5  setosa
#> 6  setosa

答案 2 :(得分:2)

一种可能的解决方案可能是:

df[, !(names(df) %in% names(df %>% select_if(is.numeric)))]

Example:
df <- data.frame(
  name = c( "a", "b", "c", "d" ),
  last_name = c( "r", "t", "s", "b" ),
  x = c( 3, 2, 1, 2 ),
  y = c( 4, 3, 4, 3 ),
  z = c( 8, 9, 6, 7 ) , stringsAsFactors = FALSE)
> df[, !(names(df) %in% names(df %>% select_if(is.numeric)))]
#  name last_name
#1    a         r
#2    b         t
#3    c         s
#4    d         b