2016-10-30 2 views
-1

Daten:berechnen und geben das Datum der ersten Bestellung des Kunden

DB <- data.frame(orderID = c(1,2,3,4,4,5,6,6,7,8),  
       orderDate = c("1.1.12","1.1.12","1.1.12","13.1.12","13.1.12","12.1.12","10.1.12","10.1.12","21.1.12","24.1.12"), 
       itemID = c(2,3,2,5,12,4,2,3,1,5), 
       customerID = c(1, 2, 3, 1, 1, 3, 2, 2, 1, 1), 
       itemPrice = c(9.99, 14.99, 9.99, 19.99, 29.99, 4.99, 9.99, 14.99, 49.99, 19.99)) 

Erwartetes Ergebnis:

DB <- data.frame(orderID = c(1,2,3,4,4,5,6,6,7,8),  
       orderDate = c("1.1.12","2.1.12","3.1.12","13.1.12","13.1.12","12.1.12","10.1.12","10.1.12","21.1.12","24.1.12"), 
       itemID = c(2,3,2,5,12,4,2,3,1,5), 
       customerID = c(1, 2, 3, 1, 1, 3, 2, 2, 1, 1), 
       itemPrice = c(9.99, 14.99, 9.99, 19.99, 29.99, 4.99, 9.99, 14.99, 49.99, 19.99), 
       DateOfFirstOrderofCustomer = c("1.1.12", "2.1.12", "3.1.12", "1.1.12", "1.1.12", "3.1.12", "2.1.12", "2.1.12", "1.1.12", "1.1.12")) 

Für Verstehen:

Der orderI D ist stetig. Produkte bestellt von der gleichen customerID am selben Tag erhalten die gleiche orderID. Wenn der gleiche Kunde Produkte an einem anderen Tag bestellt, ist er/sie ein neuer orderID.

ich eine zusätzliche Spalte für jede Zeile/Eintrag hinzufügen möchten, die das Datum des ersten Bestellung des Kunden enthält (zB Kunde 1 (customerID 1) seinen ersten Auftrag auf 1.1.12 so dieses Datum in alle Bestellungen dieses Kunden eingegeben). Wie können wir das tun?

Die ursprünglichen Daten haben ungefähr 500k Reihen: so geben Sie eine Lösung, die nur wenig Leistung braucht.

+0

Ihr 'orderDate' aus Daten und erwartetem Ergebnis stimmen nicht überein. Hoffentlich löst meine Antwort das, indem ich Dummy-Daten einfüge. – MikeRSpencer

+0

Das ist richtig - mein Fehler:/ – AbsoluteBeginner

Antwort

0

Mit nur Basis R Funktionen:

# convert the date column to date-format 
DB$orderDate <- as.Date(DB$orderDate, format('%d.%m.%y')) 

# get the first date for each customer 
DB$DateFirstOrder <- with(DB, ave(orderDate, customerID, FUN = min)) 

das Ergebnis dann wird (die Daten von Mike Spencer verwenden):

> DB 
    orderID orderDate itemID customerID itemPrice DateFirstOrder 
1  1 2012-01-01  2   1  9.99  2012-01-01 
2  2 2012-01-04  3   2  14.99  2012-01-04 
3  3 2012-01-06  2   3  9.99  2012-01-06 
4  4 2012-01-13  5   1  19.99  2012-01-01 
5  4 2012-01-13  12   1  29.99  2012-01-01 
6  5 2012-01-12  4   3  4.99  2012-01-06 
7  6 2012-01-10  2   2  9.99  2012-01-04 
8  6 2012-01-10  3   2  14.99  2012-01-04 
9  7 2012-01-21  1   1  49.99  2012-01-01 
10  8 2012-01-24  5   1  19.99  2012-01-01 

Für die schnellste Lösung, würde ich empfehle die data.table Paket. Um das gewünschte Ergebnis mit diesem Paket zu erhalten, müssen Sie tun:

library(data.table) 
setDT(DB)[, orderDate := as.Date(orderDate, format('%d.%m.%y')) 
      ][, DateFirstOrder := min(orderDate), by = customerID] 
+1

Vielen Dank für Ihre Unterstützung! Ich kann nicht überprüfen, ob es heute funktioniert: überprüft morgen früh und gibt Ihnen eine Rückmeldung. – AbsoluteBeginner

+0

@AbsoluteBeginner Froh, dass ich Ihnen helfen könnte, können Sie mich wissen lassen, wenn Sie Follow-up-Fragen haben. – h3rm4n

0

Ich habe Ihre Eingabedaten geändert, da die von Ihnen bereitgestellten Daten bei jedem Kunden das gleiche Datum des ersten Kaufs hatten. Daher war es unmöglich festzustellen, ob der Code funktioniert hat. Das Beispiel verwendet dplyr, Sie könnten auch tapply verwenden, aber Sie müssten den benannten Vektor neu formatieren.

# Dummy data 
DB <- data.frame(orderID = c(1,2,3,4,4,5,6,6,7,8),  
       orderDate = c("1.1.12","4.1.12","6.1.12","13.1.12","13.1.12","12.1.12","10.1.12","10.1.12","21.1.12","24.1.12"), 
       itemID = c(2,3,2,5,12,4,2,3,1,5), 
       customerID = c(1, 2, 3, 1, 1, 3, 2, 2, 1, 1), 
       itemPrice = c(9.99, 14.99, 9.99, 19.99, 29.99, 4.99, 9.99, 14.99, 49.99, 19.99)) 

# ------------------------------------------- 

# Change dates to a readable format 
DB$orderDate <- as.Date(DB$orderDate, format="%d.%m.%y") 

# ------------------------------------------- 

library(dplyr) 

DB <- DB %>% 
    group_by(customerID) %>% 
    mutate(DateOfFirstOrderofCustomer=min(orderDate)) 
+0

Vielen Dank für Ihre Unterstützung! Ich kann nicht überprüfen, ob es heute funktioniert: überprüft morgen früh und gibt Ihnen eine Rückmeldung. – AbsoluteBeginner

0

ich plyr Paket verwenden. Ruhe ist alles gleich.

DB <- data.frame(orderID = c(1,2,3,4,4,5,6,6,7,8),  
      orderDate = c("1.1.12","4.1.12","6.1.12","13.1.12","13.1.12","12.1.12","10.1.12","10.1.12","21.1.12","24.1.12"), 
      itemID = c(2,3,2,5,12,4,2,3,1,5), 
      customerID = c(1, 2, 3, 1, 1, 3, 2, 2, 1, 1), 
      itemPrice = c(9.99, 14.99, 9.99, 19.99, 29.99, 4.99, 9.99, 14.99, 49.99, 19.99)) 


install.packages("plyr") 
library(plyr) 

DB$orderDate <- as.Date(DB$orderDate, format="%d.%m.%y") 
DB = ddply(DB, .(customerID), mutate, DateOfFirstOrderofCustomer = min(orderDate)) 
+0

Vielen Dank für Ihre Unterstützung! Ich kann nicht überprüfen, ob es heute funktioniert: überprüft morgen früh und gibt Ihnen eine Rückmeldung. – AbsoluteBeginner

Verwandte Themen