2016-09-02 3 views
0

Ich habe 2 Datensätze, die jeweils einen Datum-Uhrzeit-Wert im POSIXlt-Format und einige andere Zahlen- und Zeichenvariablen enthalten.R - Wie zwei Datenrahmen am nächsten Zeit-Datum zu verbinden?

Ich möchte beide Datensätze basierend auf der Datum-Uhrzeit-Spalte kombinieren. Aber die Datumsstempel beider Datensätze stimmen nicht überein, daher muss ich sie mit dem nächsten Datum (vorher oder nachher) kombinieren. In meinem Beispiel muss der Datenwert "e" vom 2016-03-01 23:52:00 mit "binH" am 2016-03-02 00:00:00, nicht "binG" kombiniert werden.

Gibt es eine Funktion, die es mir erlauben würde, meine Datensätze mit dem nächsten Datum-Zeit-Wert zu kombinieren, auch wenn es danach ist?

Ich habe Wege gefunden, Daten mit dem nächsten vorherigen Datum mit der Funktion cut() oder der Funktion roll = Inf in data.tables zu kombinieren. Aber ich konnte meine Zeitstempel nicht in ein beliebiges Format bringen, das 'nearest' akzeptieren würde.

>df1 
    date1 value 
    1 2016-03-01 17:52:00  a 
    2 2016-03-01 18:01:30  b 
    3 2016-03-01 18:05:00  c 
    4 2016-03-01 20:42:30  d 
    5 2016-03-01 23:52:00  e 

    >df2 
    date2 bin_name 
    1 2016-03-01 17:00:00  binA 
    2 2016-03-01 18:00:00  binB 
    3 2016-03-01 19:00:00  binC 
    4 2016-03-01 20:00:00  binD 
    5 2016-03-01 21:00:00  binE 
    6 2016-03-01 22:00:00  binF 
    7 2016-03-01 23:00:00  binG 
    8 2016-03-02 00:00:00  binH 
    9 2016-03-02 01:00:00  binI 
+0

Ich hoffe, Sie wirklich POSIXct-Format gemeint. Das Speichern von POSIXlt-Vektoren (die wirklich Listen sind) in Datenrahmen ist ein Rezept für massive Verwirrung. –

Antwort

2

data.table sollte für diese Arbeit (können Sie den Fehler erklären Sie kommen gegen?), Obwohl es auf seine eigene (vielleicht tun, dass die Conversion auf Ihrer Datetime-Spalte manuell POSIXlt zu POSIXct konvertieren neigt zu behalte data.table glücklich). Stellen Sie außerdem sicher, dass Sie die Schlüsselspalte vor der Verwendung von roll festlegen.

(Ich habe meine eigenes Beispiel Tabellen hier geschaffen, um mein Leben zu machen, dass etwas einfacher, wenn Sie auf Ihren verwenden dput wollen, ich bin glücklich, dieses Beispiel mit Ihren Daten zu aktualisieren.):

new <- data.table(date = as.POSIXct(c("2016-03-02 12:20:00", "2016-03-07 12:20:00", "2016-04-02 12:20:00")), data.new = c("t","u","v")) 
head(new, 2) 

        date data.new 
1: 2016-03-02 12:20:00  t 
2: 2016-03-07 12:20:00  u 

old <- data.table(date = as.POSIXct(c("2016-03-02 12:20:00", "2016-03-07 12:20:00", "2016-04-02 12:20:00", "2015-03-02 12:20:00")), data.old = c("a","b","c","d")) 
head(old, 2) 


        date data.old 
1: 2016-03-02 12:20:00  a 
2: 2016-03-07 12:20:00  b 

setkey(new, date) 
setkey(old, date) 

combined <- new[ old, roll = "nearest" ] 
combined 

        date data.new data.old 
1: 2015-03-02 12:20:00  t  d 
2: 2016-03-02 12:20:00  t  a 
3: 2016-03-07 12:20:00  u  b 
4: 2016-04-02 12:20:00  v  c 

Ich habe absichtlich die zwei Tabellen unterschiedliche Zeilenlängen gemacht, um zu zeigen, wie der rollende Join mehrere Übereinstimmungen behandelt. Sie können die Art, wie es verbindet mit:

combined <- old[ new, roll = "nearest" ] 
combined 

        date data.old data.new 
1: 2016-03-02 12:20:00  a  t 
2: 2016-03-07 12:20:00  b  u 
3: 2016-04-02 12:20:00  c  v 
+1

@ user2223405 hat diese Lösung für Sie funktioniert? Wie auch immer, stellen Sie sicher, dass Sie Ihre Frage nicht einfach abbrechen. Komm zurück und lass uns wissen, was funktioniert hat und was nicht. – rosscova

Verwandte Themen