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

153

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?

stackoverflowuser2010
la source
Programmatically (par exemple , sapply(..., class))ou de manière interactive (par exemple str(...)) ou les deux? Il est généralement plus évolutive de le faire par programme, alors vous pouvez arbitrairement Filter(...)la liste des entiers, des personnages, des facteurs etc. Vous pouvez aussi utiliser grep/grepldes types de colonnes-DEDUIRE names(...)si elles suivent les conventions de nommage
smci
@smci: Je n'ai pas demandé «par programme» dans ma question initiale. Je ne sais pas pourquoi vous changeriez toute la nature de ma question.
stackoverflowuser2010
ok, il a été annulé. Cela n'a pas changé la nature entière, cela l'a clarifiée dans l'une des deux directions. Les approches interactives utilisant str(...)ne sont pas évolutives et s'essoufflent sur <100 cols.
smci

Réponses:

215

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, typeofet 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 .

gung - Réintégrer Monica
la source
1
Après avoir utilisé R pendant plusieurs mois, j'ai trouvé que 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.
stackoverflowuser2010
Salut quand j'ai fait la même chose avec appliquer au lieu de postuler, cela n'a pas fonctionné
Dom Jo
@DomJo, pourquoi l'utiliseriez-vous apply()? C'est pour les matrices. Une trame de données est une liste (de type spécial).
gung - Réintègre Monica le
50
sapply(yourdataframe, class)

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

Wilmer E. Henao
la source
18

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 fooserait remplacé par le nom de votre bloc de données.

Gavin Simpson
la source
7

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)

entrez la description de l'image ici

Cybernétique
la source
5

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 mpget amen caractère et la colonne carben 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
davsjob
la source
3

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

Loki
la source
2

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!

ML_Dev
la source
1
Il convient de noter que sous le capot, il s'agit lapply(your_data, class)d'un traitement supplémentaire pour le formatage.
Gregor Thomas
1

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
DJV
la source
1

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

library(purrr)
map(df,class)
Alexandre Lima
la source