Misalkan, Anda memiliki data.frame seperti ini:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
Bagaimana Anda memilih hanya kolom-kolom dalam x yang numerik?
Misalkan, Anda memiliki data.frame seperti ini:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
Bagaimana Anda memilih hanya kolom-kolom dalam x yang numerik?
Jawaban:
EDIT: diperbarui untuk menghindari penggunaan yang keliru sapply.
Karena bingkai data adalah daftar, kita dapat menggunakan fungsi daftar-berlaku:
nums <- unlist(lapply(x, is.numeric))
Kemudian standar subsetting
x[ , nums]
## don't use sapply, even though it's less code
## nums <- sapply(x, is.numeric)
Untuk R modern yang lebih idiomatis sekarang saya sarankan
x[ , purrr::map_lgl(x, is.numeric)]
Lebih sedikit kode, kurang mencerminkan keanehan khusus R, dan lebih mudah, dan kuat untuk digunakan pada database-back-ended tibbles:
dplyr::select_if(x, is.numeric)
undefined columns selected. Bagaimana Anda menghindarinya?
tryCatch()untuk menangani ini. Silakan pertimbangkan untuk membuka pertanyaan baru.
Filter() dari paket dasar adalah fungsi yang sempurna untuk kasus penggunaan: Anda hanya perlu kode:
Filter(is.numeric, x)
Ini juga jauh lebih cepat daripada select_if():
library(microbenchmark)
microbenchmark(
dplyr::select_if(mtcars, is.numeric),
Filter(is.numeric, mtcars)
)
mengembalikan (di komputer saya) median 60 mikrodetik untuk Filter, dan 21.000 mikrodetik untuk select_if(350x lebih cepat).
Filter()tidak berfungsi untuk di sini adalah menggantikan, misalnya Filter(is.numeric,iris) <- 0.5*Filter(is.numeric,iris)tidak akan berfungsi.
jika Anda hanya tertarik pada nama kolom maka gunakan ini:
names(dplyr::select_if(train,is.numeric))
Ini kode alternatif untuk jawaban lain:
x[, sapply(x, class) == "numeric"]
dengan data.table
x[, lapply(x, is.numeric) == TRUE, with = FALSE]
library(purrr)
x <- x %>% keep(is.numeric)
Pustaka PCAmixdata memiliki fungsi splitmix yang membagi kuantitatif (data numerik) dan kualitatif (data kategorikal) dari dataframe "YourDataframe" yang diberikan seperti yang ditunjukkan di bawah ini:
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)
Cara lain bisa sebagai berikut: -
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
Jika Anda memiliki banyak variabel faktor, Anda dapat menggunakannya select_if funtion. instal paket dplyr. Ada banyak fungsi yang memisahkan data dengan memenuhi suatu kondisi. Anda dapat mengatur kondisinya.
Gunakan seperti ini.
categorical<-select_if(df,is.factor)
str(categorical)
Ini tidak langsung menjawab pertanyaan tetapi bisa sangat berguna, terutama jika Anda menginginkan sesuatu seperti semua kolom numerik kecuali untuk kolom id Anda dan variabel dependen.
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]ataux[sapply(x,is.numeric)]berfungsi juga. Dan mereka selalu kembalidata.frame. Bandingkanx[1]vsx[,1]- pertama adalahdata.frame, kedua adalah vektor. Jika seseorang ingin mencegah konversi maka harus digunakanx[, 1, drop=FALSE].