2017-11-05 1 views
0

I einen Datenrahmen aufweisen:Extrakt durch Gruppe vorherigen Wert von anderen Gruppenspalte

ID_1 <- c("A","B","C","D","A","A","B","E","D","F","H") 
ID_2 <- c("G","D","I","A","J","B","K","D","A","H","A") 
Value <- c(10,9,15,27,3,28,4,3,11,19,12) 
DF <- as.data.frame(cbind(ID_1, ID_2, Value)) 

Ich möchte eine neue Spalte haben, die das letzte (dh vorhergehenden) umfasst zum Wert (‚Wert‘) eine gegebene ID ('ID_1') basierend auf der entsprechenden ID in einer anderen Spalte ('ID_2'). Mit anderen Worten: Die beabsichtigte Lösung sollte den letzten/letzten ID-Eintrag ('ID_2') für eine gegebene ID ('ID_1') finden und den entsprechenden Wert ('Wert') in einer neuen Spalte extrahieren.

Der letzte Datensatz sollte wie folgt aussehen (eine neue Spalte zu den bestehenden drei Spalten hinzugefügt; Abbildung):

NEW <- c(NA,NA,NA,9,27,27,28,NA,3,NA,19) 
DF_NEW <- as.data.frame(cbind(ID_1, ID_2, Value, NEW)) 

Vielen Dank im Voraus für Ihre Hilfe!

Antwort

1

Eine Option ist eine Zeilennummer Spalte DF zu erstellen, dann data.table Roll verwenden beitreten:

library(data.table) 
setDT(DF)[, rn := seq_len(.N)] 

DF[DF, 
    on=.(ID_2 = ID_1, rn = rn), 
    .(ID_1 = i.ID_1, ID_2 = i.ID_2, Value = i.Value, New = x.Value), 
    roll=Inf 
] 

# ID_1 ID_2 Value New 
# 1: A G 10 NA 
# 2: B D  9 NA 
# 3: C I 15 NA 
# 4: D A 27 9 
# 5: A J  3 27 
# 6: A B 28 27 
# 7: B K  4 28 
# 8: E D  3 NA 
# 9: D A 11 3 
#10: F H 19 NA 
#11: H A 12 19 
+0

cool :) Works! Danke, Psidom! – Daniel

+0

Gern geschehen. Froh, dass es hilft! – Psidom

Verwandte Themen