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

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

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"))

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)

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)

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"))                        

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.


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"))                        
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.