2016-05-06 2 views
0

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!

+1

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

+0

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

+0

'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

Antwort

0

Ein Alternative, nehme an, dass Datum1 'korrekt' ist und überschreibe dann mit Datum2

dd <- data.frame(date1 = c(now(), NA), date2 = c(as.POSIXct(NA), now())) 
dd2 <- dd$date1 
dd2[is.na(dd2)]<-dd$date2[is.na(dd2)] 
+0

Obwohl das gleiche im Geiste wie die andere vorgeschlagene Antwort, werde ich diese akzeptieren, weil es prägnanter ist. Vielen Dank! – matmat

1

Die folgende Lösung für mich gearbeitet, obwohl es nicht sehr sauberen Code:

dd<-read.csv("dd.csv",stringsAsFactors = F,na.strings = c("", " ")) 

dd[,1]<-as.POSIXct(dd[,1],"%m/%d/%Y %H:%M",tz = "GMT") 
dd[,2]<-as.POSIXct(dd[,2],"%m/%d/%Y %H:%M",tz = "GMT") 
dd[,'Date3']<-dd[,1] 


dd[which(!is.na(dd$Date1)),'Date3']<-dd$Date1[!is.na(dd$Date1)] 
dd[which(!is.na(dd$Date2)),'Date3']<-dd$Date2[!is.na(dd$Date2)] 

str(dd) 
'data.frame': 6 obs. of 3 variables: 
$ Date1: POSIXct, format: "2016-05-20 11:30:00" ... 
$ Date2: POSIXct, format: NA ... 
$ Date3: POSIXct, format: "2016-05-20 11:30:00" . 

sum(is.na(dd$Date3)) 
[1] 0 

Der Trick war ich Date3 mit Date1 zu erstellen, was wiederum bedeutet, dass Spalte Klasse ist POSIXct

Verwandte Themen