Unerwarteter Wert für die Länge eines Vektors in R
Frage
Ich habe den Charakter Vektor unter
a = c("2009-07-31 18:00:33", "2009-07-31 18:00:38", "2009-07-31 18:00:43", "2009-07-31 18:00:49", "2009-08-01 01:58:49", "2009-08-01 01:53:16", "2009-08-01 08:04:13", "2009-08-01 16:16:13")
Ich mag diese Zeit konvertieren Objekte so ich dies tun:
b = strptime(a, "%Y-%m-%d %H:%M:%S")
Warum a und b zu tun haben unterschiedliche Längen?
> length(a)
[1] 8
> length(b)
[1] 9
Lösung
Das Objekt b
hat Klasse POSIXlt
. Arrays von POSIXlt
Daten zurückkehren immer eine Länge von 9,
da die eine benannte Liste von neun Vektoren darstellen:
R> class(b)
[1] "POSIXt" "POSIXlt"
R> unclass(b)
$sec
[1] 33 38 43 49 49 16 13 13
$min
[1] 0 0 0 0 58 53 4 16
$hour
[1] 18 18 18 18 1 1 8 16
$mday
[1] 31 31 31 31 1 1 1 1
$mon
[1] 6 6 6 6 7 7 7 7
$year
[1] 109 109 109 109 109 109 109 109
$wday
[1] 5 5 5 5 6 6 6 6
$yday
[1] 211 211 211 211 212 212 212 212
$isdst
[1] 1 1 1 1 1 1 1 1
Klasse POSIXct
, die die (signiert) Anzahl der Sekunden seit dem Beginn repräsentiert von
1970 als numerischer Vektor, gibt Ihnen die erwartete Länge:
R> length(as.POSIXct(a))
[1] 8
R> unclass(as.POSIXct(a))
[1] 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09
[8] 1.249e+09
attr(,"tzone")
[1] ""
Andere Tipps
Wie Sie in ?strptime
sehen es konvertiert Zeichenkette in der Klasse POSIXlt
. In R gibt es zwei Arten von Zeiten: POSIXlt
und POSIXct
.
Beschreibung ist in ?DateTimeClasses
, sondern Abkürzung:
Klasse „POSIXct“ steht für die (signiert) Anzahl der Sekunden seit der Anfang des Jahres 1970 als numerischer Vektor.
Klasse „POSIXlt“ ist ein benannter Liste von Vektoren repräsentiere sec 0-61: Sekunden min 0-59: Minuten Stunde 0-23: Stunden mday 1-31: Tag des Monats mon 0-11: Monate nach dem ersten von das Jahr. Jahr Jahre seit 1900. wday 0-6 Tag der Woche, beginnend am Sonntag. yday 0-365: Tag der Jahr. ISDST Sommerzeit Flagge. Positiv, wenn in Kraft, Null, wenn nicht, negativ, wenn nicht bekannt.
So Ihre b
ist die Liste von 9 Vektoren, 8-Länge jeder.
Sie können sehen:
sapply(b,length)
Sie könnten genaue Umwandlung verwenden:
b_1 = as.POSIXlt(a, "%Y-%m-%d %H:%M:%S",tz="")
b_2 = as.POSIXct(a, "%Y-%m-%d %H:%M:%S",tz="")
length(b_1) # 9
length(b_2) # 8
Nur für das Protokoll, dieses FAQ Problem ist etwa in R ändern 2.11.0:
2.11.0 NEUE FUNKTIONEN
Länge (POSIXlt) gibt jetzt die Länge des entsprechenden abstrakten Zeit- und Datums-Vektor, anstatt immer 9 (Die Länge der zugrunde liegenden Liste Struktur). (Wunsch der PR # 14073 und PR # 10507).
Das ist vom 2. Dezember Eintritt der RSS-Feeds tägliche Änderungen im Subversion-Archiv zusammenfassen, die Entwickler-Seite für Details über das Futter.