2010-05-10 7 views
83

J'essaie de spécifier les options colClasses dans la fonction read.csv dans R. Dans mes données, la première colonne "temps" est essentiellement un vecteur de caractères alors que le reste des colonnes est numérique.Spécification de colClasses dans le fichier read.csv

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

Dans la commande ci-dessus, je voudrais R lire dans le « temps » comme colonne « caractère » et le reste sous forme numérique. Bien que la variable "données" ait eu le résultat correct après la commande terminée, R a renvoyé les avertissements suivants. Je me demande comment je pourrais réparer 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épondre

69

Le vecteur colClasses doit avoir une longueur égale au nombre de colonnes importées. En supposant que le reste de vos colonnes de jeux de données sont 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 combien de colonnes il y a. Scan (csv, sep = ',', what = "character", nlines = 1) – defoo

+22

Ceci est une réponse incorrecte et m'a fait perdre un peu de temps. La bonne réponse est ci-dessous. N'essayant pas d'être un abruti, 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, quand vous devez aussi spécifier les classes des autres variables, et qu'elles ne sont pas automatiquement reconnues comme telles par 'read.table'. – tchakravarty

11

En supposant que votre colonne « temps » a au moins une observation avec un caractère non numérique et toutes vos autres colonnes ont seulement des chiffres, puis « read.csv pour default sera de lire dans 'time' comme un 'factor' et toutes les autres colonnes comme 'numériques'. Par conséquent, la mise en « stringsAsFactors = F » aura le même résultat que la définition des « colClasses » à savoir manuellement,

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

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

Donc, dans votre exemple, vous devez utiliser:

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

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

10

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

Pour plusieurs colonnes datetime sans en-tête, et beaucoup de colonnes, indiquent que mes champs date-heure sont dans les colonnes 36 et 38, et je veux les lire comme des champs de caractères:

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