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électionner 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électionner uniquement les colonnes de x qui sont numériques ?
EDIT : mis à jour pour éviter l'utilisation de "ill-advised". sapply
.
Comme un cadre de données est une liste, nous pouvons utiliser les fonctions list-apply :
nums <- unlist(lapply(x, is.numeric))
Alors le 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 recommanderais maintenant
x[ , purrr::map_lgl(x, is.numeric)]
Moins de code, moins de reflets des bizarreries particulières de R, et plus de simplicité et de robustesse pour l'utilisation de la base de données :
dplyr::select_if(x, is.numeric)
Les versions plus récentes de dplyr, supportent également la syntaxe suivante :
x %>% dplyr::select(where(is.numeric))
Filter()
du paquet de base est la fonction parfaite pour ce cas d'utilisation : Il suffit de coder :
Filter(is.numeric, x)
Il est également beaucoup plus rapide que select_if()
:
library(microbenchmark)
microbenchmark(
dplyr::select_if(mtcars, is.numeric),
Filter(is.numeric, mtcars)
)
retourne (sur mon ordinateur) une médiane de 60 microsecondes pour Filter
et 21 000 microsecondes pour select_if
(350x plus rapide).
Cette solution n'échoue pas lorsqu'aucune colonne numérique n'est présente. Y a-t-il des inconvénients à l'utiliser ?
Le filtre s'applique uniquement aux lignes d'un cadre de données et non aux colonnes. En tant que telle, cette solution ne donnerait pas le bon résultat.
iris %>% dplyr::select(where(is.numeric)) #as per most recent updates
Une autre option avec purrr
serait de nier discard
fonction :
iris %>% purrr::discard(~!is.numeric(.))
Si vous voulez les noms des colonnes numériques, vous pouvez ajouter names
ou colnames
:
iris %>% purrr::discard(~!is.numeric(.)) %>% names
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.