Как выбрать нечисловые столбцы с помощью dplyr:: select if

мне нужно, чтобы выбрать все столбцы, которые не являются числовыми. Я могу легко выбрать все числовые столбцы с помощью select_if:

mtcars %>% select_if(is.numeric)

Что делать, если я хочу выбрать non-numeric столбцы? Я попробовал:

mtcars %>% select_if(!is.numeric)

но я получил сообщение об ошибке ниже:

Error in !is.numeric : invalid argument type

большое спасибо за помощь!

3 ответов


можно использовать purrr ' s negate() который включен, если вы используете library(tidyverse) а не просто library(dplyr)

library(tidyverse)
iris %>% select_if(negate(is.numeric))

вы можете использовать анонимную функцию в стиле муррр, при условии, что у вас есть достаточно недавняя версия dplyr:

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

одним из возможных решений может быть:

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