Angabe von colClasses in der Datei read.csv

108

Ich versuche, die colClassesOptionen in der read.csvFunktion in R anzugeben . In meinen Daten ist die erste Spalte "Zeit" im Grunde ein Zeichenvektor, während der Rest der Spalten numerisch ist.

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

Im obigen Befehl möchte ich, dass R in der Spalte "Zeit" als "Zeichen" und der Rest als numerisch liest. Obwohl die Variable "data" nach Abschluss des Befehls das richtige Ergebnis hatte, gab R die folgenden Warnungen zurück. Ich frage mich, wie ich diese Warnungen beheben könnte.

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

defoo
quelle

Antworten:

78

Der colClasses-Vektor muss eine Länge haben, die der Anzahl der importierten Spalten entspricht. Angenommen, der Rest Ihrer Datensatzspalten besteht aus 5:

colClasses=c("character",rep("numeric",5))
George Dontas
quelle
7
Man kann wahrscheinlich das Folgende verwenden, um die erste Zeile der CSV zu lesen und zu bestimmen, wie viele Spalten es gibt. scan (csv, sep = ',', what = "character", nlines = 1)
defoo
34
Dies ist eigentlich eine falsche Antwort und hat mich für eine Weile abgeworfen. Die richtige Antwort ist unten. Ich habe nicht versucht, ein Idiot zu sein, sondern wollte nur sicherstellen, dass es niemand anderem passiert.
Rob
3
@Rob In meinem Fall ist dies immer noch die richtige Antwort, wenn Sie auch die Klassen der anderen Variablen angeben müssen und diese von nicht automatisch als solche erkannt werden read.table.
Tchakravarty
173

Sie können die colClasse nur für eine Spalte angeben.

In Ihrem Beispiel sollten Sie also Folgendes verwenden:

data <- read.csv('test.csv', colClasses=c("time"="character"))
Etienne
quelle
21
Nicht, dass es viel ausmacht, aber ich fand, dass dies funktioniert, ohne den Spaltennamen zu zitieren.
Hendy
Dieser Ansatz ist tatsächlich sehr nützlich, wenn Sie versuchen, zitierte Ganzzahlen als Zeichen zu lesen. Vielen Dank!
Nils-Holmberg
14

Angenommen, Ihre 'Zeit'-Spalte enthält mindestens eine Beobachtung mit einem nicht numerischen Zeichen und alle anderen Spalten haben nur Zahlen. Dann liest' read.csv standardmäßig 'Zeit' als 'Faktor' und den Rest von die Spalten als 'numerisch'. Daher hat das Setzen von 'stringsAsFactors = F' das gleiche Ergebnis wie das manuelle Setzen von 'colClasses', dh

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

Wenn Sie sich auf Namen aus der Kopfzeile anstatt auf Spaltennummern beziehen möchten, können Sie Folgendes verwenden:

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
quelle
4

Angenommen, meine Datums- / Uhrzeitfelder befinden sich für mehrere Datums- / Uhrzeitspalten ohne Kopfzeile und viele Spalten in den Spalten 36 und 38, und ich möchte, dass sie als Zeichenfelder eingelesen werden:

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

Ich weiß, dass OP nach der utils::read.csvFunktion gefragt hat , aber lassen Sie mich eine Antwort auf diese Fragen geben, die hier auf der Suche nach readr::read_csvder Vorgehensweise von der Tidyverse kommen.

read_csv ("test.csv", col_names=FALSE, col_types = cols (.default = "c", time = "i"))

Dies sollte den Standardtyp für alle Spalten als Zeichen festlegen , während die Zeit als Ganzzahl analysiert wird.

elcortegano
quelle
0

Wenn wir kombinieren, was @Hendy und @Oddysseus Ithaca beigetragen haben, erhalten wir einen saubereren und allgemeineren (dh anpassungsfähigen?) Codeabschnitt.

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