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?
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)
La fonction select_if(
) du paquet dplyr est une solution élégante:
library("dplyr")
select_if(x, is.numeric)
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).
au cas où vous êtes intéressé uniquement par les noms de colonnes, utilisez ceci:
names(dplyr::select_if(train,is.numeric))
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]
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)
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)
Une autre façon pourrait être la suivante: -
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
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))