Припустимо, у вас є такий 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, які є числовими?
Відповіді:
EDIT: оновлено, щоб уникнути використання нераціональних порад 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)
undefined columns selected
. Як уникнути цього?
tryCatch()
для вирішення цього питання. Розгляньте питання щодо відкриття нового питання.
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 разів швидше).
Filter()
що тут не працює, замінює, наприклад Filter(is.numeric,iris) <- 0.5*Filter(is.numeric,iris)
, не буде працювати.
якщо вас цікавлять лише назви стовпців, скористайтеся цим:
names(dplyr::select_if(train,is.numeric))
Це альтернативний код для інших відповідей:
x[, sapply(x, class) == "numeric"]
з data.table
x[, lapply(x, is.numeric) == TRUE, with = FALSE]
Бібліотека PCAmixdata має функціональний сплітмікс, який розділяє кількісні (числові дані) та якісні (категоричні дані) заданого фрейму даних "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)
Інший спосіб може бути таким:
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
Якщо у вас багато змінних факторів, ви можете використовувати select_if
функцію. встановити пакети dplyr. Існує багато функцій, що розділяють дані, задовольняючи умову. ви можете встановити умови.
Використовуйте так.
categorical<-select_if(df,is.factor)
str(categorical)
Це не відповідає безпосередньо на питання, але може бути дуже корисним, особливо якщо ви хочете щось подібне до всіх числових стовпців, за винятком стовпця 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))
x[nums]
абоx[sapply(x,is.numeric)]
працює також. І вони завжди повертаютьсяdata.frame
. Порівняйтеx[1]
vsx[,1]
- перший -data.frame
це вектор. Якщо ви хочете запобігти перетворенню, тоді слід скористатисяx[, 1, drop=FALSE]
.