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

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

mtcars %>% select_if(is.numeric)

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

mtcars %>% select_if(!is.numeric)

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

Error in !is.numeric : invalid argument type

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


person zesla    schedule 24.01.2018    source источник
comment
Взгляните сюда: stackoverflow .com/questions/39592879/   -  person Sean Lin    schedule 24.01.2018


Ответы (3)


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

library(tidyverse)
iris %>% select_if(negate(is.numeric))
person MrFlick    schedule 24.01.2018

Вы можете использовать анонимную функцию в стиле мурлыканья, если у вас достаточно свежая версия 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
person alistaire    schedule 24.01.2018
comment
фантастика - хотя решение @MrFlick работает, мне это решение нравится больше, потому что вам не нужно загружать другую библиотеку. Маленький нюанс: приведенный выше код также работает с точкой (.) вместо (.x), как в iris %>% select_if(~!is.numeric(.)). - person Agile Bean; 24.10.2018
comment
Да, я использую .x в функциях в стиле мурлыканья, потому что его легче отличить от использования ., чтобы указать каналам, где размещать данные. - person alistaire; 24.10.2018
comment
О, понятно, я думал, что вы должны использовать синтаксис dplyr для переданного объекта. Не знал про идентификатор трубы в стиле мурлыка, большое спасибо - person Agile Bean; 25.10.2018

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

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
person MKR    schedule 24.01.2018