Предположим, у вас есть data.frame, как это:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
Как вы выберете только те столбцы в x, которые являются числовыми?
Предположим, у вас есть data.frame, как это:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
Как вы выберете только те столбцы в x, которые являются числовыми?
ОБНОВЛЕНИЕ: обновлено, чтобы избежать использования опрометчивых sapply
.
Поскольку фрейм данных является списком, мы можем использовать функции применения списка:
nums <- unlist(lapply(x, is.numeric))
Тогда стандартное подмножество
x[ , nums]
## don't use sapply, even though it less code
## nums <- sapply(x, is.numeric)
Для более идиоматического современного R я бы сейчас порекомендовал
x[ , purrr::map_lgl(x, is.numeric)]
Меньше кодов, меньше отражающих R специфических причуд, а также более простой и надежный в использовании для фоновых элементов базы данных:
dplyr::select_if(x, is.numeric)
Функция dplyr package select_if(
) является элегантным решением:
library("dplyr")
select_if(x, is.numeric)
Filter()
из базового пакета является идеальной функцией для этого варианта использования:
Вам просто нужно кодировать:
Filter(is.numeric, x)
Это также намного быстрее, чем select_if()
:
library(microbenchmark)
microbenchmark(
dplyr::select_if(mtcars, is.numeric),
Filter(is.numeric, mtcars)
)
возвращает (на моем компьютере) медиану 60 микросекунд для Filter
и 21 000 микросекунд для select_if
(в 350 раз быстрее).
если вас интересуют только имена столбцов, используйте это:
names(dplyr::select_if(train,is.numeric))
Это альтернативный код для других ответов:
x[, sapply(x, class) == "numeric"]
с a data.table
x[, lapply(x, is.numeric) == TRUE, with = FALSE]
Библиотека PCAmixdata имеет functon splitmix, который разбивает количественные (числовые данные) и качественные (категориальные данные) данного кадра данных "YourDataframe", как показано ниже:
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)
Если у вас много переменных факторов, вы можете использовать select_if
funtion.
установите пакеты dplyr. Существует много функций, которые отделяют данные, удовлетворяя условию. вы можете установить условия.
Используйте это.
categorical<-select_if(df,is.factor)
str(categorical)
Другой способ может быть следующим: -
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
Это не дает прямого ответа на вопрос, но может быть очень полезным, особенно если вы хотите что-то вроде всех числовых столбцов, кроме столбца 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))