241 votes

Sélectionner uniquement les colonnes numériques d'un cadre de données

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 ?

379voto

mdsumner Points 13001

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))

97voto

Sharon Points 2179

L'interface du paquet dplyr select_if( ) est une solution élégante :

library("dplyr")
select_if(x, is.numeric)

59voto

Kevin Zarca Points 1064

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).

0 votes

Cette solution n'échoue pas lorsqu'aucune colonne numérique n'est présente. Y a-t-il des inconvénients à l'utiliser ?

0 votes

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.

4 votes

@Michael ne confonds pas Filter du paquet de base et filter du paquet dplyr !

9voto

AlexB Points 1952
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

9voto

user3065757 Points 16

Si vous n'êtes intéressé que par les noms de colonnes, utilisez ceci :

names(dplyr::select_if(train,is.numeric))

Prograide.com

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.

Powered by:

X