121 votes

Spécifier les colClasses dans le fichier read.csv

J'essaie d'indiquer le colClasses dans la section read.csv dans R. Dans mes données, la première colonne time est essentiellement un vecteur de caractères, tandis que le reste des colonnes sont numériques.

data <- read.csv("test.csv", comment.char="" , 
                 colClasses=c(time="character", "numeric"), 
                 strip.white=FALSE)

Dans la commande ci-dessus, je veux que R lise le fichier time comme "caractère" et les autres comme numériques. Bien que le data variable a obtenu le résultat correct après la fin de la commande, R a renvoyé les avertissements suivants. Je me demande comment je peux corriger ces avertissements ?

Messages d'avertissement :
1 : Dans read.table(file = file, header = header, sep = sep, quote = quote, : toutes les colonnes nommées dans 'colClasses' n'existent pas.
2 : Dans tmp[i[i > 0L]] <- colClasses : le nombre d'éléments à remplacer n'est pas un multiple de la longueur de remplacement

Derek

199voto

Etienne Points 511

Vous pouvez spécifier la colClasse pour une seule colonne.

Ainsi, dans votre exemple, vous devriez utiliser :

data <- read.csv('test.csv', colClasses=c("time"="character"))

24 votes

Non pas que cela ait beaucoup d'importance, mais j'ai trouvé que cela fonctionnait sans citer le nom de la colonne.

0 votes

Cette approche est en fait très utile lorsqu'on essaie de lire des entiers cités en tant que caractères. Merci !

88voto

George Dontas Points 12116

Le vecteur colClasses doit avoir une longueur égale au nombre de colonnes importées. Si l'on suppose que le reste des colonnes de votre ensemble de données sont 5 :

colClasses=c("character",rep("numeric",5))

7 votes

On peut probablement utiliser ce qui suit pour lire la première ligne du csv et déterminer combien de colonnes il y a. scan(csv,sep=',', what="character" , nlines=1 )

37 votes

Il s'agit en fait d'une réponse incorrecte qui m'a déconcerté pendant un petit moment. La bonne réponse est ci-dessous. Je n'essaie pas de faire le con, je voulais juste m'assurer que cela n'arriverait pas à quelqu'un d'autre.

4 votes

@Rob Dans mon cas, c'est toujours la réponse correcte, lorsque vous devez également spécifier les classes des autres variables, et qu'elles ne sont pas automatiquement reconnues comme telles par read.table .

14voto

wkmor1 Points 1848

En supposant que votre colonne 'time' a au moins une observation avec un caractère non-numérique et que toutes vos autres colonnes n'ont que des nombres, alors le défaut de 'read.csv sera de lire 'time' comme un 'facteur' et toutes les autres colonnes comme 'numériques'. Par conséquent, la définition de 'stringsAsFactors=F' aura le même résultat que la définition manuelle de 'colClasses', c'est-à-dire..,

data <- read.csv('test.csv', stringsAsFactors=F)

11voto

scentoni Points 179

Si vous voulez vous référer aux noms de l'en-tête plutôt qu'aux numéros de colonne, vous pouvez utiliser quelque chose comme ceci :

fname <- "test.csv"
headset <- read.csv(fname, header = TRUE, nrows = 10)
classes <- sapply(headset, class)
classes[names(classes) %in% c("time")] <- "character"
dataset <- read.csv(fname, header = TRUE, colClasses = classes)

10voto

EuGENE Points 600

Je sais que l'OP a demandé à propos de la utils::read.csv mais permettez-moi de fournir une réponse pour ceux qui viennent ici en cherchant comment le faire en utilisant la fonction readr::read_csv du tidyverse.

read_csv ("test.csv", col_names=FALSE, col_types = cols (.default = "c", time = "i"))

Cela devrait définir le type par défaut de toutes les colonnes en tant que caractère alors que temps sera interprété comme un nombre entier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X