2016-10-30 11 views
-1

データ:計算して出力する、顧客の最初の注文日

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)) 

期待される成果:理解するための

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")) 

orderI Dが連続しています。同じ日から同じcustomerIDから注文された商品は、同じorderIDとなります。同じ顧客が別の日に商品を注文すると、それは新しいorderIDです。私は、顧客の最初の注文(例えば、顧客1(customerID 1)の日付を含むすべての行/エントリの追加の列を追加したい

ので、この日付は、この顧客からのすべての注文に入力され1.1.12の彼の最初の注文をしました)。どうすればこのことができますか?

元のデータは約500k行です:したがって、わずかな性能しか必要としないソリューションを提供します。

+0

あなたの 'orderDate'データと期待される結果は一致しません。うまくいけば私の答えはダミーデータを含むことでこれを解決します。 – MikeRSpencer

+0

そうです - 私の間違い:/ – AbsoluteBeginner

答えて

0

# 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)) 

その後、(マイク・スペンサーのデータ使用)される結果:最速の解決のために

> 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 

、私は希望をdata.tableパッケージをお勧めします。このパッケージに望ましい結果を得るために、あなたは何をする必要があります。

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

ありがとうございます。明日の朝にチェックし、あなたにフィードバックを与えます。 – AbsoluteBeginner

+0

@AbsoluteBeginnerご連絡いただければ幸いです。フォローアップに関する質問があれば教えてください。 – h3rm4n

0

入力データを変更しました。すべての顧客から最初に購入した日付が同じで、コードが正しく機能しているかどうかは分かりませんでした。この例ではdplyrを使用していますが、tapplyも使用できますが、名前付きベクトルを再フォーマットする必要があります。ただ、ベースRの関数で

# 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

ありがとうございました!明日の朝にチェックし、あなたにフィードバックを与えます。 – AbsoluteBeginner

0

私はplyrパッケージを使用しています。残りはすべて同じです。

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

ありがとうございます。明日の朝にチェックし、あなたにフィードバックを与えます。 – AbsoluteBeginner

関連する問題