Выбор только числовых столбцов из фрейма данных - PullRequest
150 голосов
/ 03 мая 2011

Предположим, у вас есть data.frame, подобный этому:

x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])

Как бы вы выбрали только те столбцы в x, которые являются числовыми?

Ответы [ 9 ]

245 голосов
/ 03 мая 2011

РЕДАКТИРОВАТЬ: обновлено, чтобы избежать использования опрометчивых sapply.

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

nums <- unlist(lapply(x, is.numeric))  

Тогда стандартное подмножество

x[ , nums]

## don't use sapply, even though it's less code
## nums <- sapply(x, is.numeric)

Для более идиоматического современного R я бы сейчас порекомендовал

x[ , purrr::map_lgl(x, is.numeric)]

Меньше кодов, меньше отражающих специфические особенности R, а также более простой и надежный для использования с фоновыми базами данных:

dplyr::select_if(x, is.numeric)
62 голосов
/ 25 ноября 2016

Функция select_if() пакета dplyr - элегантное решение:

library("dplyr")
select_if(x, is.numeric)
24 голосов
/ 09 ноября 2016

Filter() из базового пакета - идеальная функция для этого варианта использования: Вам просто нужно код:

Filter(is.numeric, x)

Это также намного быстрее, чем select_if():

library(microbenchmark)
microbenchmark(
    dplyr::select_if(mtcars, is.numeric),
    Filter(is.numeric, mtcars)
)

возвращает (на моем компьютере) медиану 60 микросекунд для Filter и 21 000 микросекунд для dplyr (в 350 раз быстрее).

4 голосов
/ 05 апреля 2018

, если вас интересуют только имена столбцов, используйте это:

names(dplyr::select_if(train,is.numeric))
3 голосов
/ 13 ноября 2016

Это альтернативный код другим ответам:

x[, sapply(x, class) == "numeric"]

с data.table

x[, lapply(x, is.numeric) == TRUE, with = FALSE]
2 голосов
/ 13 ноября 2017

Библиотека PCAmixdata имеет функцию funmon splitmix, которая разделяет количественные (числовые данные) и качественные (категориальные данные) заданный кадр данных «ВашДанный кадр», как показано ниже:

install.packages("PCAmixdata")
library(PCAmixdata)
split <- splitmix(YourDataframe)
X1 <- split$X.quanti(Gives numerical columns in the dataset) 
X2 <- split$X.quali (Gives categorical columns in the dataset)
1 голос
/ 09 октября 2018

Другой способ может быть следующим: -

#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
1 голос
/ 06 января 2017

Если у вас много факторных переменных, вы можете использовать функцию select_if.установить пакеты dplyr.Есть много функций, которые разделяют данные, удовлетворяя условию.Вы можете установить условия.

Используйте вот так.

categorical<-select_if(df,is.factor)
str(categorical)
0 голосов
/ 29 марта 2018

Это не дает прямого ответа на вопрос, но может быть очень полезным, особенно если вы хотите что-то вроде всех числовых столбцов, кроме вашего столбца id и зависимой переменной.

numeric_cols <- sapply(dataframe, is.numeric) %>% which %>% 
                   names %>% setdiff(., c("id_variable", "dep_var"))

dataframe %<>% dplyr::mutate_at(numeric_cols, function(x) your_function(x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...