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?
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.031.599-0.8180.872-2.682$ x1: int 12345$ x2: logi TRUETRUEFALSEFALSEFALSE$ X3: Factor w/5 levels "a","b","c","d",..:12345
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"
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
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.
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>12161601103.92.6216.5014422161601103.92.8817.00144322.84108933.852.3218.61141
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):
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>12161601103.92.6216.5014422161601103.92.8817.00144322.84108933.852.3218.61141421.462581103.083.2219.41031
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]).
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 nommagestr(...)
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:La solution de @Wilmer E Henao H est très simplifiée:
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):L'approche de @Gavin Simpson est également rationalisée, mais fournit des informations légèrement différentes de celles de
class()
:Pour plus d'informations sur
class
,typeof
et l'enfant du milieumode
, 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 .la source
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).Où yourdataframe est le nom du bloc de données que vous utilisez
la source
je voudrais suggerer
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.la source
Passez simplement votre bloc de données dans la fonction suivante:
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:
la source
Pour les petites trames de données:
vous donne une impression du df avec les types de données
Pour les trames de données volumineuses:
vous donne une vue structurée des types de données:
Pour obtenir une liste du type de données des colonnes (comme indiqué par @Alexandre ci-dessus):
donne une liste de types de données:
Pour modifier le type de données d'une colonne:
convertit les colonnes
mpg
etam
en caractère et la colonnecarb
en entier:la source
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 logiqueVous pouvez résumer le nombre de colonnes de chaque type de données avec cela
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 .
la source
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.
Vous pourriez alors faire quelque chose comme
var(my.data[t$numeric])
.J'espère que c'est utile!
la source
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
la source
Une autre option consiste à utiliser la fonction map du package purrr.
la source