2017-02-21 2 views
1

ich zwei Datenrahmen haben, enthält die erste Kundentransaktionen eines Online-ShopsKonfrontieren und Aktualisierungswerte zwischen zwei Datenrahmen

ItemCode Invoice Quantity Date  UnitPrice CustomerID 
1234  1111  12   12/11/04 12.90  70829 
3342  1134  2   14/12/04 5.00   70562 
2345  1231  5   21/12/04 8.99   71233 

Die zweite enthält nur die gelöschten Transaktionen des Ladens

ItemCode Invoice Quantity Date  UnitPrice CustomerID 
3342  NA   -2   14/12/04 5.00   70562 
1345  NA   -10   27/02/05 1.99   81728 
2345  NA   -1   22/12/04 8.99   71233 

ich mag den ersten Datenrahmen mit den tatsächlichen Käufen jeden Kunden aktualisieren, zB:

ItemCode Invoice Quantity Date  UnitPrice CustomerID 
1234  1111  12   12/11/04 12.90  70829 
3342  1134  0   14/12/04 5.00   70562 
2345  1231  4   21/12/04 8.99   71233 

Ich denke, dass ich möglicherweise eine benutzerdefinierte Funktion schreiben muss, mit einer Schleife, die für jede Zeile in dem Dataset gelöschter Transaktionen die CustomerID und den ItemCode konfrontiert und dann den Mengenwert in dem ersten Datenframe aktualisiert.

Antwort

1

Wenn ein CustomerID kann nur auf einen Datensatz einer bestimmten ItemCode auf einem bestimmten Date verknüpft werden, dann einfach ein LEFT JOIN (siehe ?merge) des ersten und zweiten Datenrahmen auf diesen drei Attributen.

Ich werde das als Kommentar schreiben, aber ich habe beschlossen, stattdessen etwas Code zu schreiben.

orig<-data.frame(ItemCode=c(1234,3342,2345), Invoice=c(1111,1134,1231), Quantity=c(12,2,5), 
       Date=as.Date(c("12/11/04","14/12/04","21/12/04"), format="%d/%m/%y"), 
       UnitPrice=c(12.9,5,8.99), CustomerID = c(70829,70562,71233)) 
delt<-data.frame(ItemCode=c(1345,3342,2345), Invoice=rep(NA,3), Quantity=c(-10,-2,-1), 
       Date=as.Date(c("27/02/05","14/12/04","21/12/04"), format="%d/%m/%y"), 
       UnitPrice=c(1.99,5,8.99), CustomerID = c(81728,70562,71233)) 
merged <- merge(orig, delt, by=c("ItemCode", "Date","CustomerID","UnitPrice"), all.x=TRUE) 
merged$Quantity = ifelse(is.na(merged$Quantity.y),0,merged$Quantity.y) + merged$Quantity.x 
merged[,c("ItemCode", "Date","CustomerID","Invoice.x", "UnitPrice", "Quantity",)] 

    ItemCode  Date CustomerID Invoice.x Quantity 
1:  1234 2004-11-12  70829  1111  12 
2:  2345 2004-12-21  71233  1231  4 
3:  3342 2004-12-14  70562  1134  0 

Oder mit data.table

require(data.table) 
setDT(orig) 
setDT(delt) 
delt[orig,on=.(ItemCode, Date, CustomerID,UnitPrice)][,.(ItemCode, Date, CustomerID, i.Invoice, UnitPrice, Quantity=i.Quantity + ifelse(is.na(Quantity),0,Quantity))] 

ItemCode  Date CustomerID i.Invoice UnitPrice Quantity 
1:  1234 2004-11-12  70829  1111  12.90  12 
2:  3342 2004-12-14  70562  1134  5.00  0 
3:  2345 2004-12-21  71233  1231  8.99  4 
Verwandte Themen