Frage:
Gibt es eine Möglichkeit, das Datumsformat anzugeben, wenn das Argument colClasses in read.table / read.csv verwendet wird?
(Mir ist klar, dass ich nach dem Import konvertieren kann, aber mit vielen solchen Datumsspalten wäre es einfacher, dies im Importschritt zu tun.)
Beispiel:
Ich habe eine CSV mit Datumsspalten im Format %d/%m/%Y
.
dataImport <- read.csv("data.csv", colClasses = c("factor","factor","Date"))
Dies führt zu einer falschen Konvertierung. Zum Beispiel 15/07/2008
wird 0015-07-20
.
Reproduzierbarer Code:
data <-
structure(list(func_loc = structure(c(1L, 2L, 3L, 3L, 3L, 3L,
3L, 4L, 4L, 5L), .Label = c("3076WAG0003", "3076WAG0004", "3076WAG0007",
"3076WAG0009", "3076WAG0010"), class = "factor"), order_type = structure(c(3L,
3L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 1L), .Label = c("PM01", "PM02",
"PM03"), class = "factor"), actual_finish = structure(c(4L, 6L,
1L, 2L, 3L, 7L, 1L, 8L, 1L, 5L), .Label = c("", "11/03/2008",
"14/08/2008", "15/07/2008", "17/03/2008", "19/01/2009", "22/09/2008",
"6/09/2007"), class = "factor")), .Names = c("func_loc", "order_type",
"actual_finish"), row.names = c(NA, 10L), class = "data.frame")
write.csv(data,"data.csv", row.names = F)
dataImport <- read.csv("data.csv")
str(dataImport)
dataImport
dataImport <- read.csv("data.csv", colClasses = c("factor","factor","Date"))
str(dataImport)
dataImport
Und so sieht die Ausgabe aus:
r
date
read.table
read.csv
Tommy O'Dell
quelle
quelle
read.table
und einformat
Argument hinzuzufügen , das an weitergegeben wirdas.Date
. Es würde mich nicht wundern, wenn es einen besseren Weg gibt, an den ich nicht denke.Antworten:
Sie können Ihre eigene Funktion schreiben, die eine Zeichenfolge akzeptiert und sie im gewünschten Format in ein Datum konvertiert. Anschließend können Sie
setAs
sie mit deras
Methode als Methode festlegen . Dann können Sie Ihre Funktion als Teil der colClasses verwenden.Versuchen:
Ändern Sie dann bei Bedarf, um für Ihre Daten zu arbeiten.
Bearbeiten ---
Möglicherweise möchten Sie
setClass('myDate')
zuerst ausgeführt werden, um die Warnung zu vermeiden (Sie können die Warnung ignorieren, aber es kann ärgerlich werden, wenn Sie dies häufig tun, und dies ist ein einfacher Aufruf, der sie beseitigt).quelle
setMethod('myDate')
soll tun? Das Ausführen gibt mir nur einen Fehler ...setClass
(jetzt behoben). Es wird verhindertsetAs
, dass eine Warnung ausgegeben wird, dass 'myDate' nicht als Klasse vorhanden ist. Die Warnung ist harmlos und alles funktioniert immer noch. Wenn Sie jedoch die Klasse festlegen, wird die Warnung nicht einmal angezeigt.Wenn Sie nur ein Datumsformat ändern möchten, können Sie
Defaults
das Standardformat innerhalb des Pakets ändernas.Date.character
Ich denke, die Antwort von @Greg Snow ist weitaus besser, da sie das Standardverhalten einer häufig verwendeten Funktion nicht ändert.
quelle
Falls Sie auch Zeit brauchen:
quelle
Vor langer Zeit wurde das Problem von Hadley Wickham gelöst. Heutzutage ist die Lösung auf einen Oneliner reduziert:
Vielleicht wollen wir sogar unnötiges Zeug loswerden:
quelle