Specificare colClass in read.csv


108

Sto cercando di specificare le colClassesopzioni nella read.csvfunzione in R. Nei miei dati, la prima colonna "tempo" è fondamentalmente un vettore di caratteri mentre il resto delle colonne sono numeriche.

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

Nel comando precedente, vorrei che R leggesse nella colonna "ora" come "carattere" e il resto come numerico. Sebbene la variabile "data" avesse il risultato corretto dopo il completamento del comando, R ha restituito i seguenti avvertimenti. Mi chiedo come posso correggere questi avvisi?

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

Risposte:


78

Il vettore colClasses deve avere una lunghezza uguale al numero di colonne importate. Supponendo che le altre colonne del set di dati siano 5:

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

7
si può probabilmente usare quanto segue per leggere la prima riga del csv e determinare quante colonne ci sono. scan (csv, sep = ',', what = "character", nlines = 1)
defoo

34
Questa in realtà è una risposta errata e mi ha spiazzato per un po '. La risposta corretta è di seguito. Non cercavo di essere un coglione, volevo solo assicurarmi che non succedesse a nessun altro.
Rob l'

3
@Rob Nel mio caso, questa è ancora la risposta corretta, quando devi anche specificare le classi delle altre variabili, e non vengono automaticamente riconosciute come tali da read.table.
tchakravarty

173

È possibile specificare colClasse solo per una colonna.

Quindi nel tuo esempio dovresti usare:

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

21
Non che importi molto, ma ho scoperto che funziona senza citare il nome della colonna.
Hendy

Questo approccio è in realtà molto utile quando si cerca di leggere numeri interi tra virgolette come caratteri. Grazie!
nils-holmberg,

14

Supponendo che la colonna "tempo" abbia almeno un'osservazione con un carattere non numerico e tutte le altre colonne abbiano solo numeri, l'impostazione predefinita di "read.csv sarà leggere in" tempo "come un" fattore "e tutto il resto le colonne come "numeriche". Pertanto l'impostazione di "stringsAsFactors = F" avrà lo stesso risultato dell'impostazione manuale di "colClasses", ovvero

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

10

Se vuoi fare riferimento ai nomi dall'intestazione piuttosto che ai numeri di colonna, puoi usare qualcosa del genere:

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

Per più colonne datetime senza intestazione e molte colonne, supponiamo che i miei campi datetime siano nelle colonne 36 e 38 e voglio che vengano letti come campi carattere:

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

3

So che OP ha chiesto informazioni sulla utils::read.csvfunzione, ma permettimi di fornire una risposta per questi che vengono qui cercando come farlo usando readr::read_csvda 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 il tempo sarebbe analizzato come numero intero.


0

Se combiniamo ciò che hanno contribuito @Hendy e @Oddysseus Ithaca, otteniamo un pezzo di codice più pulito e più generale (cioè adattabile?).

    data <- read.csv("test.csv", head = F, colClasses = c(V36 = "character", V38 = "character"))                        
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.