Câu trả lời:
EDIT: cập nhật để tránh sử dụng không đúng sapply
.
Vì khung dữ liệu là một danh sách, chúng ta có thể sử dụng các hàm áp dụng danh sách:
nums <- unlist(lapply(x, is.numeric))
Sau đó, tập hợp con tiêu chuẩn
x[ , nums]
## don't use sapply, even though it's less code
## nums <- sapply(x, is.numeric)
Đối với một R hiện đại hơn thành ngữ bây giờ tôi muốn giới thiệu
x[ , purrr::map_lgl(x, is.numeric)]
Ít mã hơn, ít phản ánh các quirks cụ thể của R và đơn giản hơn và mạnh mẽ hơn để sử dụng trên các tibble kết thúc cơ sở dữ liệu:
dplyr::select_if(x, is.numeric)
undefined columns selected
. Làm thế nào để bạn tránh nó?
tryCatch()
để đối phó với điều này. Hãy xem xét việc mở một câu hỏi mới.
Filter()
từ gói cơ sở là chức năng hoàn hảo cho trường hợp sử dụng đó: Bạn chỉ cần mã:
Filter(is.numeric, x)
Nó cũng nhanh hơn nhiều so với select_if()
:
library(microbenchmark)
microbenchmark(
dplyr::select_if(mtcars, is.numeric),
Filter(is.numeric, mtcars)
)
trả về (trên máy tính của tôi) trung bình 60 micro giây Filter
và 21 000 micro giây cho select_if
(nhanh hơn 350 lần).
Filter()
không hoạt động ở đây sẽ thay thế, ví dụ như Filter(is.numeric,iris) <- 0.5*Filter(is.numeric,iris)
sẽ không hoạt động.
trong trường hợp bạn chỉ quan tâm đến tên cột thì hãy sử dụng:
names(dplyr::select_if(train,is.numeric))
Đây là một mã thay thế cho các câu trả lời khác:
x[, sapply(x, class) == "numeric"]
với một data.table
x[, lapply(x, is.numeric) == TRUE, with = FALSE]
library(purrr)
x <- x %>% keep(is.numeric)
Thư viện PCAmixdata có functon splitmix phân tách định lượng (Dữ liệu số) và định tính (Dữ liệu phân loại) của một khung dữ liệu nhất định "YourDataframe" như dưới đây:
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)
Một cách khác có thể như sau: -
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
Nếu bạn có nhiều biến nhân tố, bạn có thể sử dụng select_if
funtion. cài đặt các gói dplyr. Có nhiều chức năng phân tách dữ liệu bằng cách thỏa mãn một điều kiện. bạn có thể đặt điều kiện.
Sử dụng như thế này.
categorical<-select_if(df,is.factor)
str(categorical)
Điều này không trực tiếp trả lời câu hỏi nhưng có thể rất hữu ích, đặc biệt nếu bạn muốn một cái gì đó giống như tất cả các cột số ngoại trừ cột id và biến phụ thuộc.
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]
hoặcx[sapply(x,is.numeric)]
làm việc là tốt. Và họ luôn trở vềdata.frame
. So sánhx[1]
vsx[,1]
- thứ nhất làdata.frame
, thứ hai là một vectơ. Nếu ai muốn ngăn chặn chuyển đổi thì phải sử dụngx[, 1, drop=FALSE]
.