J'utilise R et j'ai chargé des données dans un dataframe en utilisant read.csv()
. Comment déterminer le type de données de chaque colonne du bloc de données?
str(...)
ne sont pas évolutives et s'essoufflent sur <100 cols.
J'utilise R et j'ai chargé des données dans un dataframe en utilisant read.csv()
. Comment déterminer le type de données de chaque colonne du bloc de données?
str(...)
ne sont pas évolutives et s'essoufflent sur <100 cols.
Réponses:
Votre meilleur pari pour commencer est d'utiliser ?str()
. Pour explorer quelques exemples, faisons quelques données:
set.seed(3221) # this makes the example exactly reproducible
my.data <- data.frame(y=rnorm(5),
x1=c(1:5),
x2=c(TRUE, TRUE, FALSE, FALSE, FALSE),
X3=letters[1:5])
La solution de @Wilmer E Henao H est très simplifiée:
sapply(my.data, class)
y x1 x2 X3
"numeric" "integer" "logical" "factor"
L'utilisation str()
vous permet d'obtenir ces informations ainsi que des bonus supplémentaires (tels que les niveaux de vos facteurs et les premières valeurs de chaque variable):
str(my.data)
'data.frame': 5 obs. of 4 variables:
$ y : num 1.03 1.599 -0.818 0.872 -2.682
$ x1: int 1 2 3 4 5
$ x2: logi TRUE TRUE FALSE FALSE FALSE
$ X3: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
L'approche de @Gavin Simpson est également rationalisée, mais fournit des informations légèrement différentes de celles de class()
:
sapply(my.data, typeof)
y x1 x2 X3
"double" "integer" "logical" "integer"
Pour plus d'informations sur class
, typeof
et l'enfant du milieu mode
, consultez cet excellent fil de discussion SO: Une enquête complète sur les types de choses dans R. «mode» et «classe» et «typeof» sont insuffisantes .
str(dataframe)
c'était le moyen le plus rapide de déterminer les types de colonnes en un coup d'œil. Les autres approches nécessitent plus de frappes et n'affichent pas autant d'informations, mais elles sont utiles si les types de données de colonne sont une entrée pour d'autres fonctions.
apply()
? C'est pour les matrices. Une trame de données est une liste (de type spécial).
sapply(yourdataframe, class)
Où yourdataframe est le nom du bloc de données que vous utilisez
je voudrais suggerer
sapply(foo, typeof)
si vous avez besoin des types réels des vecteurs dans le bloc de données. class()
est un peu une bête différente.
Si vous n'avez pas besoin d'obtenir ces informations sous forme de vecteur (c'est-à-dire que vous n'en avez pas besoin pour faire autre chose par programmation plus tard), utilisez simplement str(foo)
.
Dans les deux cas, il foo
serait remplacé par le nom de votre bloc de données.
Passez simplement votre bloc de données dans la fonction suivante:
data_types <- function(frame) {
res <- lapply(frame, class)
res_frame <- data.frame(unlist(res))
barplot(table(res_frame), main="Data Types", col="steelblue", ylab="Number of Features")
}
pour produire un tracé de tous les types de données dans votre bloc de données. Pour l' ensemble de données iris, nous obtenons ce qui suit:
data_types(iris)
Pour les petites trames de données:
library(tidyverse)
as_tibble(mtcars)
vous donne une impression du df avec les types de données
# A tibble: 32 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
* <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
Pour les trames de données volumineuses:
glimpse(mtcars)
vous donne une vue structurée des types de données:
Observations: 32
Variables: 11
$ mpg <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8, 16.4, 17....
$ cyl <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, ...
$ disp <dbl> 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 140.8, 167.6, 167.6...
$ hp <dbl> 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 180, 205, 215...
$ drat <dbl> 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92, 3.07, 3.0...
$ wt <dbl> 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190, 3.150, 3.440, 3.440...
$ qsec <dbl> 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.00, 22.90, 18.30, 18.90...
$ vs <dbl> 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, ...
$ am <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, ...
$ gear <dbl> 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, ...
$ carb <dbl> 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2, 2, 4, 2, ...
Pour obtenir une liste du type de données des colonnes (comme indiqué par @Alexandre ci-dessus):
map(mtcars, class)
donne une liste de types de données:
$mpg
[1] "numeric"
$cyl
[1] "numeric"
$disp
[1] "numeric"
$hp
[1] "numeric"
Pour modifier le type de données d'une colonne:
library(hablar)
mtcars %>%
convert(chr(mpg, am),
int(carb))
convertit les colonnes mpg
et am
en caractère et la colonne carb
en entier:
# A tibble: 32 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <dbl> <int>
1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
Comme ce n'était pas clairement indiqué, j'ajoute simplement ceci:
Je cherchais un moyen de créer une table contenant le nombre d'occurrences de tous les types de données .
Disons que nous avons un data.frame
avec deux colonnes numériques et une colonne logique
dta <- data.frame(a = c(1,2,3),
b = c(4,5,6),
c = c(TRUE, FALSE, TRUE))
Vous pouvez résumer le nombre de colonnes de chaque type de données avec cela
table(unlist(lapply(dta, class)))
# logical numeric
# 1 2
Ceci est extrêmement pratique, si vous avez beaucoup de colonnes et que vous souhaitez obtenir un aperçu rapide.
Pour donner du crédit: Cette solution a été inspirée par la réponse de @Cybernetic .
Voici une fonction qui fait partie du package helpRFunctions qui renverra une liste de tous les différents types de données dans votre bloc de données, ainsi que les noms de variables spécifiques associés à ce type.
install.package('devtools') # Only needed if you dont have this installed.
library(devtools)
install_github('adam-m-mcelhinney/helpRFunctions')
library(helpRFunctions)
my.data <- data.frame(y=rnorm(5),
x1=c(1:5),
x2=c(TRUE, TRUE, FALSE, FALSE, FALSE),
X3=letters[1:5])
t <- list.df.var.types(my.data)
t$factor
t$integer
t$logical
t$numeric
Vous pourriez alors faire quelque chose comme var(my.data[t$numeric])
.
J'espère que c'est utile!
lapply(your_data, class)
d'un traitement supplémentaire pour le formatage.
Si vous importez le fichier csv en tant que data.frame (et non matrice), vous pouvez également utiliser summary.default
summary.default(mtcars)
Length Class Mode
mpg 32 -none- numeric
cyl 32 -none- numeric
disp 32 -none- numeric
hp 32 -none- numeric
drat 32 -none- numeric
wt 32 -none- numeric
qsec 32 -none- numeric
vs 32 -none- numeric
am 32 -none- numeric
gear 32 -none- numeric
carb 32 -none- numeric
Une autre option consiste à utiliser la fonction map du package purrr.
library(purrr)
map(df,class)
sapply(..., class))
ou de manière interactive (par exemplestr(...)
) ou les deux? Il est généralement plus évolutive de le faire par programme, alors vous pouvez arbitrairementFilter(...)
la liste des entiers, des personnages, des facteurs etc. Vous pouvez aussi utilisergrep/grepl
des types de colonnes-DEDUIREnames(...)
si elles suivent les conventions de nommage