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

défoo
la source

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))
George Dontas
la source
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"))
Etienne
la source
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)
wkmor1
la source
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)
scentoni
la source
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"))                        
Ulysse Ithaque
la source
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.

elcortegano
la source
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"))                        
seapen
la source