web-dev-qa-db-fra.com

Spécifier des colClasses dans le read.csv

J'essaie de spécifier les options colClasses dans la fonction read.csv de R. Dans mes données, la première colonne "heure" est essentiellement un vecteur de caractères, tandis que les autres 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 voudrais que R se lise dans la colonne "heure" en tant que "caractère" et le reste en tant que valeur 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 résoudre 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

96
defoo

La longueur du vecteur colClasses doit être égale au nombre de colonnes importées. En supposant que le reste de vos colonnes de jeu de données est 5:

colClasses=c("character",rep("numeric",5))
73
George Dontas

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

Donc, dans votre exemple, vous devriez utiliser:

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

En supposant que votre colonne "heure" comporte au moins une observation avec un caractère non numérique et que toutes vos autres colonnes ne comportent que des chiffres, le paramètre par défaut de read.csv sera de lire "heure" comme "facteur" et tout le reste de la colonne. les colonnes sont 'numériques'. Par conséquent, la définition de 'stringsAsFactors = F' aura le même résultat que la définition manuelle des 'colClasses', à savoir,

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

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)
10
scentoni

Pour plusieurs colonnes datetime sans en-tête et beaucoup de colonnes, supposons que mes champs datetime figurent dans les colonnes 36 et 38 et que je veuille les lire sous forme de champs de caractères:

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

Si nous combinons les contributions de @Hendy et @Oddysseus Ithaca, nous obtenons un bloc de code plus propre et plus général.

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

Je sais que OP a posé des questions sur la fonction utils::read.csv, mais laissez-moi vous donner une réponse pour ceux qui viennent ici en cherchant comment le faire en utilisant readr::read_csv à partir de 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 comme caractère , tandis que time serait analysé comme un entier.

0
EuGENE