Ich habe eine data.frame mit zwei Spalten vom Typ POSIXct, obwohl für jede Zeile wird nur eine Spalte einen Wert haben, zum BeispielWie kann ich den Wert einer der beiden POSIXct-Spalten in einem dat.frame einer neuen POSIXct-Spalte zuweisen?
dd <- data.frame(date1 = c(now(), NA), date2 = c(as.POSIXct(NA), now()))
> dd
date1 date2
1 2016-05-06 11:30:04 <NA>
2 <NA> 2016-05-06 11:30:04
ich jetzt eine dritte Spalte erstellen möchten, die die enthalten Wert der jeweiligen Spalte hat einen nicht-NA-Wert, das heißt, soll das Ergebnis aussieht
> dd
date1 date2 date3
1 2016-05-06 11:26:36 <NA> 2016-05-06 11:26:36
2 <NA> 2016-05-06 11:26:36 2016-05-06 11:26:36
ich habe mit ifelse versucht(), aber es funktioniert nicht:
> mutate(dd, date3 = ifelse(!is.na(date1), date1, date2))
date1 date2 date3
1 2016-05-06 11:30:04 <NA> 1462559405
2 <NA> 2016-05-06 11:30:04 1462559405
Keine logische Vektor-basierte Zuweisung:
> dd[!is.na(dd$date1), "date3"] <- dd[!is.na(dd$date1), "date1"]
> dd[!is.na(dd$date2), "date3"] <- dd[!is.na(dd$date2), "date2"]
> dd
date1 date2 date3
1 2016-05-06 11:30:04 <NA> 1462559405
2 <NA> 2016-05-06 11:30:04 1462559405
Kann jemand dieses Verhalten erklären?
Bin ich stecken mit dem Erstellen eines neuen data.frame mit einer leeren Spalte der Klasse POSIXct und dann in es zuweisen? Dies wäre nicht ideal, weil es die Regel bricht, dass es einfach in einen data.frame zugewiesen werden kann und es magisch funktionieren lässt.
Oder sollte ich die Zuordnung machen und dann die Spaltenklasse ändern (wie in dieser vorgeschlagen)? Dies wäre nicht ideal, da bei der Umwandlung in numerisch im Zuge der Zuweisung die Zeitzone abfällt, die ich dann beim Aufruf von as.POSIXct() erneut liefern müsste.
Vielen Dank im Voraus!
POSIXct ist wirklich nur eine Nummer ber. Konvertiere zurück in die Datumsform mit 'as.POSIXct wie folgt: dd $ date3 <- as.POSIXct (ifelse (is.na (dd $ date1), dd $ date2, dd $ date1), ursprung = ursprung)'. Auch nett: 'dd [! Is.na (dd)]' ... aber das ist spaltenweise, also 't (dd) [! Is.na (t (dd))]', vielleicht. – alistaire
Danke! Aber könnten Sie mir etwas erklären oder auf etwas hinweisen, warum das passiert? Mein naives Verständnis ist, dass POSIXct eine Klasse ist, die sich von der numerischen Klasse unterscheidet. Warum passiert der Numerus-Numerus, wenn ich einem data.frame zuteile? – matmat
'ifelse' streift Attribute, einschließlich Klassen; siehe '? ifelse', das ein Beispiel hat, das dem Ihren sehr ähnlich ist. Die Option '[]' ist komplizierter, da Sie jedoch einen Teil (nicht das Ganze) einer Spalte zuweisen, die nicht existiert, wird also gezwungen, die Spalte zu füllen. Es gibt einige Infos zu '? \' [.data.frame \ '', aber nicht viel. Wenn Sie der gesamten Spalte zuerst etwas mit der entsprechenden Klasse zuweisen (z. B. 'dd $ date3 <- as.POSIXct (NA)'), funktioniert das problemlos. – alistaire