Supposons que vous ayez un data.frame comme celui-ci:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
Comment sélectionneriez-vous uniquement les colonnes de x qui sont numériques?
Supposons que vous ayez un data.frame comme celui-ci:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
Comment sélectionneriez-vous uniquement les colonnes de x qui sont numériques?
Réponses:
EDIT: mis à jour pour éviter l'utilisation de mal avisé sapply
.
Puisqu'un bloc de données est une liste, nous pouvons utiliser les fonctions d'application de liste:
nums <- unlist(lapply(x, is.numeric))
Puis sous-ensemble standard
x[ , nums]
## don't use sapply, even though it's less code
## nums <- sapply(x, is.numeric)
Pour un R moderne plus idiomatique, je recommande maintenant
x[ , purrr::map_lgl(x, is.numeric)]
Moins de code, moins reflétant les bizarreries particulières de R, et plus simple et plus robuste à utiliser sur les tables de base de données back-end:
dplyr::select_if(x, is.numeric)
undefined columns selected
. Comment l'évitez-vous?
tryCatch()
pour gérer cela. Veuillez envisager d'ouvrir une nouvelle question.
Filter()
du package de base est la fonction parfaite pour ce cas d'utilisation: il vous suffit de coder:
Filter(is.numeric, x)
C'est aussi beaucoup plus rapide que select_if()
:
library(microbenchmark)
microbenchmark(
dplyr::select_if(mtcars, is.numeric),
Filter(is.numeric, mtcars)
)
renvoie (sur mon ordinateur) une médiane de 60 microsecondes pour Filter
, et 21 000 microsecondes pour select_if
(350x plus rapide).
Filter()
qui ne fonctionne pas ici, c'est le remplacement, par exemple Filter(is.numeric,iris) <- 0.5*Filter(is.numeric,iris)
ne fonctionnera pas.
si vous ne vous intéressez qu'aux noms de colonnes, utilisez ceci:
names(dplyr::select_if(train,is.numeric))
Ceci est un code alternatif aux autres réponses:
x[, sapply(x, class) == "numeric"]
avec un data.table
x[, lapply(x, is.numeric) == TRUE, with = FALSE]
library(purrr)
x <- x %>% keep(is.numeric)
La bibliothèque PCAmixdata a une fonction splitmix qui divise les données quantitatives (données numériques) et qualitatives (données catégorielles) d'un dataframe donné "YourDataframe" comme indiqué ci-dessous:
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)
Une autre façon pourrait être la suivante: -
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
Si vous avez de nombreuses variables de facteur, vous pouvez utiliser select_if
funtion. installez les packages dplyr. Il existe de nombreuses fonctions qui séparent les données en satisfaisant une condition. vous pouvez définir les conditions.
Utilisez comme ça.
categorical<-select_if(df,is.factor)
str(categorical)
Cela ne répond pas directement à la question mais peut être très utile, surtout si vous voulez quelque chose comme toutes les colonnes numériques à l'exception de votre colonne id et de la variable dépendante.
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]
oux[sapply(x,is.numeric)]
fonctionne aussi bien. Et ils reviennent toujoursdata.frame
. Comparezx[1]
vsx[,1]
- le premier estdata.frame
, le second est un vecteur. Si l'on veut empêcher la conversion, il faut utiliserx[, 1, drop=FALSE]
.