web-dev-qa-db-fra.com

Sélection de colonnes numériques uniquement dans un bloc de données

Supposons que vous ayez un data.frame comme ceci: 

x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])

Comment choisiriez-vous uniquement les colonnes de x qui sont numériques? 

136

EDIT: mis à jour pour éviter l’utilisation de sapply non conseillé. 

Comme un bloc de données est une liste, nous pouvons utiliser les fonctions list-apply:

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 recommanderais maintenant

x[ , purrr::map_lgl(x, is.numeric)]

Moins codé, moins reflétant les bizarreries particulières de R, et plus simple et robuste à utiliser sur les bas de page à base de données: 

dplyr::select_if(x, is.numeric)
234
mdsumner

La fonction select_if() du paquet dplyr est une solution élégante:

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

Filter() du paquet de base est la fonction parfaite pour ce cas d'utilisation: Vous devez simplement 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 de 21 000 microsecondes pour dplyr (350x plus rapide). 

20
Kevin Zarca

au cas où vous êtes intéressé uniquement par les noms de colonnes, utilisez ceci:

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

C'est un code alternatif à d'autres réponses:

x[, sapply(x, class) == "numeric"]

avec un data.table

x[, lapply(x, is.numeric) == TRUE, with = FALSE]
3

La bibliothèque PCAmixdata a functon splitmix qui scinde les données quantitatives (données numériques) et qualitatives (données catégoriques) d'une trame de données donnée "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)
2
user1

Si vous avez plusieurs variables de facteur, vous pouvez utiliser select_if function . Installer 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)
2
서영재

Une autre façon pourrait être la suivante: -

#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
1
Ayushi

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 sauf votre colonne id et votre 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))
0
RJMCMC