Specificando colClasses nel read.csv
Domanda
Sto cercando di specificare le opzioni colClasses
nella funzione read.csv
in R. Nei miei dati, la prima colonna "tempo" è fondamentalmente un vettore di carattere, mentre il resto delle colonne sono numerici.
data <- read.csv("test.csv", comment.char="" ,
colClasses=c(time="character", "numeric"),
strip.white=FALSE)
Nel comando sopra, vorrei R per leggere nella colonna "tempo" come "carattere" e il resto come numerico. Anche se, la variabile "dati" ha avuto il risultato corretto dopo che il comando è stato completato, R restituito le seguenti avvertenze. Mi chiedo come ho potuto risolvere questi avvertimenti?
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
Soluzione
I colClasses vettore deve avere lunghezza pari al numero di colonne importate. Supponendo che il resto delle colonne del set di dati sono 5:
colClasses=c("character",rep("numeric",5))
Altri suggerimenti
È possibile specificare il colClasse solo per uno colonne.
Quindi nel tuo esempio, si dovrebbe usare:
data <- read.csv('test.csv', colClasses=c("time"="character"))
Supponendo che la colonna 'tempo' ha almeno un'osservazione con un carattere non numerico e tutte le altre colonne hanno solo i numeri, poi 'di default di read.csv sarà da leggere in 'tempo' come un 'fattore' e tutti il resto delle colonne come 'numerico'. Pertanto impostazione 'stringsAsFactors = F' avrà lo stesso risultato come impostazione '' colClasses manualmente cioè.,
data <- read.csv('test.csv', stringsAsFactors=F)
Se si vuole fare riferimento ai nomi dalla intestazione piuttosto che i numeri di colonna, si può usare qualcosa di simile a questo:
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)
Nel caso di più colonne datetime senza intestazione, e un sacco di colonne, dicono i miei campi datetime sono riportati nelle colonne 36 e 38, e voglio loro leggere come campi di caratteri:
data<-read.csv("test.csv", head=FALSE, colClasses=c("V36"="character","V38"="character"))
Lo so OP chiesto sulla funzione utils::read.csv
, ma mi permetta di dare una risposta a queste che vengono qui a cercare come fare usando readr::read_csv
dal tidyverse.
read_csv ("test.csv", col_names=FALSE, col_types = cols (.default = "c", time = "i"))
Questo dovrebbe impostare il tipo predefinito per tutte le colonne come carattere , mentre Ora verrebbe usata come intero.
Se combiniamo ciò @Hendy e @Oddysseus Itaca ha contribuito, otteniamo più pulita e un più generale (vale a dire, adattabile?) Pezzo di codice.
data <- read.csv("test.csv", head = F, colClasses = c(V36 = "character", V38 = "character"))