2017-07-05 7 views
0

Angenommen, ich habe einen R-Datenrahmen. Jede Zeile steht für eine Transaktion, die von jemandem an einem bestimmten Datum ausgeführt wurde. Es gibt viele Spalten, die mehr Informationen über die Transaktion enthalten, z. B. das Geld, das er ausgegeben hat, und die Anzahl der Waren, die er/sie gekauft hat. Es ist möglich, dass eine Person viele Transaktionen hat, so dass eine Person mehrere Zeilen haben kann. Sagen wir, dass ich eine Spalte haben möchte, die aufzeichnet, wie viel der Kunde bei der letzten Transaktion ausgegeben hat. Im Moment benutze ich eine for-Schleife, um durch den gesamten Datenrahmen zu sehen, ob dieser Kunde eine vorherige Transaktion hat. Wenn der Kunde eine vorherige Transaktion hat, füge ich dem Feld einen Wert hinzu; wenn nicht, springe ich einfach in die nächste Reihe. Es funktioniert, aber ich habe es mit einem Datenrahmen mit mehr als 1,7 Millionen Zeilen zu tun, so dass die for-Schleife für mich zu langsam ist. Haben Sie bessere Ideen, um das Problem zu lösen? Schätzen!!!Im R-Datenframe, wie nach früheren Transaktionsinformationen gesucht wird

+4

Es ist einfacher, Ihnen zu helfen, wenn Sie irgendeine Art von [reproduzierbaren Beispiel] liefern (https://stackoverflow.com/questions/5963269/how-to-make -a-great-r-reproduzierbar-Beispiel) mit Beispieleingabedaten und der gewünschten Ausgabe, so dass mögliche Lösungen getestet werden können. Es muss nicht voll sein, aber zumindest etwas zu spielen, ist nützlich und weniger abstrakt. – MrFlick

Antwort

0

Angenommen, Sie haben einen data.frame wie diese

library(dplyr) 
df <- read.table(header = TRUE, text = " 
        CustId transaction  Spent 
        ID1 1  500 
        ID1 2  706 
        ID1 3  925 
        ID1 4  1195 
        ID1 5 1472 
        ID1 6 1413 
        ID2 1 950 
        ID2 2 1203 
        ID2 3 1486 
        ID2 4 1658") 

df%>%group_by(CustId)%>%dplyr::mutate(Last=Spent[transaction==max(transaction)]) 


    CustId transaction Spent Last 
    <fctr>  <int> <int> <int> 
1  ID1   1 500 1413 
2  ID1   2 706 1413 
3  ID1   3 925 1413 
4  ID1   4 1195 1413 
5  ID1   5 1472 1413 
6  ID1   6 1413 1413 
7  ID2   1 950 1658 
8  ID2   2 1203 1658 
9  ID2   3 1486 1658 
10 ID2   4 1658 1658 
+0

Mein Verständnis ist, dass OP an der Menge der vorherigen Transaktion interessiert ist: 'df%>% group_by (CustId)%>% muate (Last = lag (Verbraucht))' – HubertL

+0

@HubertLc Nur ein Tipp ~~ – Wen

Verwandte Themen