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?
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)
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]
.undefined columns selected
. Comment l'évitez-vous?tryCatch()
pour gérer cela. Veuillez envisager d'ouvrir une nouvelle question.La
select_if(
fonction) du package dplyr est une solution élégante:la source
Filter()
du package de base est la fonction parfaite pour ce cas d'utilisation: il vous suffit de coder:C'est aussi beaucoup plus rapide que
select_if()
:renvoie (sur mon ordinateur) une médiane de 60 microsecondes pour
Filter
, et 21 000 microsecondes pourselect_if
(350x plus rapide).la source
Filter()
qui ne fonctionne pas ici, c'est le remplacement, par exempleFilter(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:
la source
Ceci est un code alternatif aux autres réponses:
avec un
data.table
la source
la source
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:
la source
Une autre façon pourrait être la suivante: -
la source
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.
la source
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.
la source