Kopieren Sie Zeilen in der data.table basierend auf der Bedingung

8

Meine Beispieldaten.tabelle sieht wie folgt aus

Startdaten

%Vor%

Das Ziel besteht darin, die Informationen in den Spalten Kontostand und Beschäftigung zu kopieren, wenn der Status von "P" nach "R" mit "id" wechselt. I.e. Ich möchte die Daten in der letzten Periode verwenden, in der eine ID "P" ist, und die vorhandenen Informationen für alle nächsten Perioden überschreiben, in denen die ID "R" ist.

Daher ist das Ziel, diese data.table

zu erhalten

Ziel

%Vor%

Beachten Sie, dass die Spalten time und status itself (und natürlich id) nicht betroffen sind.

Ich habe versucht, seq_len über IDs zu verwenden, dann setze diese Spalte auf Null, wenn der Status "R ist und suche nach dem maximalen Wert (nach ID) dieser Spalte, um als Indikator zu verwenden, welche Zeile kopiert werden muss. Ich bin mir sicher, dass es einen schnelleren und besseren Weg gibt, das zu lösen. Vielleicht sogar ein Einzeiler.

Wenn etwas unklar ist, lass es mich wissen

    
Dave van Brecht 18.02.2016, 08:08
quelle

3 Antworten

12

Eine Möglichkeit besteht darin, die gewünschten Spalten auf NA s zu setzen, wenn status == R , und dann die letzte Beobachtung vorwärts zu führen (LOCF), da alle id s mit P beginnen, I don ' Ich denke, Sie müssen dies wirklich tun, indem Sie id und damit die Leistung verbessern. Hier ist ein Weg

%Vor%     
David Arenburg 18.02.2016, 08:38
quelle
5

Hinzufügen einer einfachen data.table solution vs zoo solution. Data.table Rolling Join scheint besser zu skalieren.

%Vor%

Und der Maßstab.

%Vor%     
jangorecki 18.02.2016 16:01
quelle
0

Dies funktioniert nur mit data.table , aber die Laufzeit ist viel langsamer als die von David vorgeschlagene Option locf .

%Vor%     
Adam 18.02.2016 09:42
quelle

Tags und Links