Supponiamo di avere un data.frame come questo:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
Come selezioneresti solo quelle colonne in x che sono numeriche?
Supponiamo di avere un data.frame come questo:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
Come selezioneresti solo quelle colonne in x che sono numeriche?
Risposte:
EDIT: aggiornato per evitare l'uso di sconsiderati sapply
.
Poiché un frame di dati è un elenco, possiamo usare le funzioni di applicazione dell'elenco:
nums <- unlist(lapply(x, is.numeric))
Quindi il subsetting standard
x[ , nums]
## don't use sapply, even though it's less code
## nums <- sapply(x, is.numeric)
Per una R moderna più idiomatica, ora consiglierei
x[ , purrr::map_lgl(x, is.numeric)]
Meno codey, meno riflettendo le stranezze particolari di R, e più semplice e robusto da usare su tabelle con back-end di database:
dplyr::select_if(x, is.numeric)
undefined columns selected
. Come lo eviti?
tryCatch()
per gestire questo. Si prega di considerare l'apertura di una nuova domanda.
Filter()
dal pacchetto base è la funzione perfetta per quel caso d'uso: devi semplicemente codificare:
Filter(is.numeric, x)
È anche molto più veloce di select_if()
:
library(microbenchmark)
microbenchmark(
dplyr::select_if(mtcars, is.numeric),
Filter(is.numeric, mtcars)
)
restituisce (sul mio computer) una mediana di 60 microsecondi per Filter
e select_if
21000 microsecondi per (350 volte più veloce).
Filter()
che non funziona qui sta sostituendo, ad esempio Filter(is.numeric,iris) <- 0.5*Filter(is.numeric,iris)
non funzionerà.
nel caso tu sia interessato solo ai nomi delle colonne, usa questo:
names(dplyr::select_if(train,is.numeric))
Questo è un codice alternativo ad altre risposte:
x[, sapply(x, class) == "numeric"]
con un data.table
x[, lapply(x, is.numeric) == TRUE, with = FALSE]
library(purrr)
x <- x %>% keep(is.numeric)
La libreria PCAmixdata ha funzioni splitmix che suddivide quantitativo (dati numerici) e qualitativo (dati categorici) di un determinato frame di dati "YourDataframe" come mostrato di seguito:
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)
Un altro modo potrebbe essere il seguente: -
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
Se hai molte variabili fattoriali, puoi usare la select_if
funzione. installa i pacchetti dplyr. Esistono molte funzioni che separano i dati soddisfacendo una condizione. puoi impostare le condizioni.
Usa così.
categorical<-select_if(df,is.factor)
str(categorical)
Questo non risponde direttamente alla domanda, ma può essere molto utile, soprattutto se si desidera qualcosa come tutte le colonne numeriche ad eccezione della colonna ID e della variabile dipendente.
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]
ox[sapply(x,is.numeric)]
funziona pure. E ritornano sempredata.frame
. Confrontax[1]
vsx[,1]
: il primo èdata.frame
, il secondo è un vettore. Se si desidera impedire la conversione, è necessario utilizzarex[, 1, drop=FALSE]
.