web-dev-qa-db-fra.com

Déterminer les types de données des colonnes d'un bloc de données

J'utilise R et ai chargé des données dans une trame de données en utilisant read.csv(). Comment déterminer le type de données de chaque colonne du bloc de données?

109

Votre meilleur choix est d’utiliser ?str() . Pour explorer quelques exemples, créons des 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])

@Wilmer E La solution de Henao H est très simple: 

sapply(my.data, class)
        y        x1        x2        X3 
"numeric" "integer" "logical"  "factor" 

En utilisant str(), vous obtiendrez cette information plus des avantages supplémentaires (tels que le niveau 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 simplifié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: Un aperçu complet des types d’objets en mode R. insuffisant

165
gung
sapply(yourdataframe, class)

Où yourdataframe est le nom du bloc de données que vous utilisez

34
Wilmer E. Henao

Je voudrais suggerer

sapply(foo, typeof)

si vous avez besoin des types réels de vecteurs dans la trame de données. class() est un peu une bête différente.

Si vous n'avez pas besoin d'obtenir cette information en tant que vecteur (c'est-à-dire que vous n'en avez pas besoin pour faire autre chose par programme plus tard), utilisez simplement str(foo).

Dans les deux cas, foo serait remplacé par le nom de votre trame de données.

15
Gavin Simpson

Passez simplement votre trame 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 cadre de données. Pour le jeu de données iris, nous obtenons ce qui suit: 

data_types(iris)

 enter image description here

7
Cybernetic

Comme cela n’a pas été dit clairement, 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

table(unlist(lapply(dta, class)))
# logical numeric 
#       1       2 

Cela est extrêmement pratique si vous avez beaucoup de colonnes et que vous souhaitez obtenir un aperçu rapide. 

Pour donner crédit: Cette solution a été inspirée par la réponse de @Cybernetic

3
loki

Voici une fonction qui fait partie du paquet helpRFunctions qui renverra une liste de tous les types de données de votre cadre 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 pouvez ensuite faire quelque chose comme var(my.data[t$numeric]).

J'espère que c'est utile!

2
ML_Dev

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 grandes trames de données:

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 changer 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ères et la colonne carb en nombres entiers:

# 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
1
davsjob

Une autre option consiste à utiliser la fonction map du paquet purrr.

library(purrr)
map(df,class)
1
Alexandre Lima

Si vous importez le fichier csv en tant que data.frame (et non en tant que 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
0
DJV