Spécification de colClasses dans le read.csv


108

J'essaie de spécifier les colClassesoptions de la read.csvfonction dans R. Dans mes données, la première colonne «temps» est essentiellement un vecteur de caractères tandis que le reste des colonnes est numérique.

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

Dans la commande ci-dessus, je voudrais que R lise dans la colonne «temps» comme «caractère» et le reste comme numérique. Bien que la variable "data" ait eu le résultat correct une fois la commande terminée, R a renvoyé les avertissements suivants. Je me demande comment je pourrais corriger ces avertissements?

Warning messages:
 1: In read.table(file = file, header = header, sep = sep, quote = quote,  :
    not all columns named in 'colClasses' exist
 2: In tmp[i[i > 0L]] <- colClasses :
    number of items to replace is not a multiple of replacement length

Derek

Réponses:


78

Le vecteur colClasses doit avoir une longueur égale au nombre de colonnes importées. Supposons que le reste de vos colonnes de jeu de données soit 5:

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

7
on peut probablement utiliser ce qui suit pour lire la première ligne du csv et déterminer le nombre de colonnes. scan (csv, sep = ',', what = "character", nlines = 1)
defoo

34
Ceci est en fait une réponse incorrecte et m'a jeté pendant un petit moment. La bonne réponse est ci-dessous. N'essayant pas d'être un imbécile, je voulais juste m'assurer que cela n'arrive à personne d'autre.
Rob

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

173

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

Donc, dans votre exemple, vous devez utiliser:

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

21
Pas que cela compte beaucoup, mais j'ai trouvé que cela fonctionnait sans citer le nom de la colonne.
Hendy

Cette approche est en fait très utile lorsque vous essayez de lire des entiers entre guillemets en tant que caractère. Merci!
nils-holmberg le

14

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 la valeur par défaut de 'read.csv sera de lire dans' time 'comme un' facteur 'et tout le reste de les 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)

10

Si vous souhaitez faire référence à des noms de l'en-tête plutôt qu'à des 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)

4

Pour plusieurs colonnes datetime sans en-tête et beaucoup de colonnes, disons que mes champs datetime sont dans les colonnes 36 et 38, et je veux qu'ils soient lus comme des champs de caractères:

data<-read.csv("test.csv", head=FALSE,   colClasses=c("V36"="character","V38"="character"))                        

3

Je sais qu'OP a posé des questions sur la utils::read.csvfonction, mais permettez-moi de fournir une réponse pour ceux qui viennent ici pour savoir comment le faire en utilisant readr::read_csvle tidyverse.

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

Cela devrait définir le type par défaut pour toutes les colonnes en tant que caractère , tandis que le temps serait analysé comme un entier.


0

Si nous combinons ce que @Hendy et @Oddysseus Ithaca ont contribué, nous obtenons un morceau de code plus propre et plus général (c'est-à-dire adaptable?).

    data <- read.csv("test.csv", head = F, colClasses = c(V36 = "character", V38 = "character"))                        
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.