2017-09-07 16 views
0

日付範囲、つまりリリース日とそれ以降のバージョンのリリース日の間に、どの製品バージョンが有効であったかを示すダミー変数を手動で作成する必要はありません。私は対応するリリース日付と次のバージョンがリリースされたときに数百のバージョンがあり、このデータを購入データフレームと結合/結合します。日付範囲によるダミー変数の登録R

は現在、私はこのように見える2つのデータフレーム(バージョンと購入)を持っている:

View(Version) 
Type Version Release_Date Next_Release 
A  1.2.3 2013-11-14  2014-01-11 
B  1.3.1 2014-01-11  2014-02-20 
A  1.5.1 2014-02-20  2014-03-08 
A  1.5.2 2014-03-08  2014-04-06 
B  1.5.3 2014-04-06  2014-04-12 
A  1.5.4 2014-04-12  2014-04-15 
B  1.5.5 2014-05-15  2014-05-20 
B  1.6.1 2014-05-20  2014-06-26 
A  1.6.2 2014-06-26  2014-07-14 

View(Purchases) 
TIMESTAMP Amount 
2013-11-14 15.44 
2013-11-14 13.39 
2013-11-14 15.35 
2013-11-15 86.43 
2014-01-15 12.30 
2014-01-17 23.55 

私は日付の範囲に応じて[購入]データフレーム内の各バージョンのダミー変数を作成したいと考えていますバージョンが有効になっていました。すなわち、購入のタイムスタンプは、そのバージョンは、そのバージョンのダミー=任意のアドバイスや助けを事前に1つのそれ以外は0

View(Purchases) 
TIMESTAMP Amount Version_1.2.3 Version_1.3.1 .... 
2013-11-14 15.44  1    0 
2013-11-14 13.39  1    0 
2013-11-14 15.35  1    0 
2013-11-15 86.43  1    0 
2014-01-15 12.30  0    1 
2014-01-17 23.55  0    1 
.... 

おかげであなたは、有効にされた日付の範囲内にある場合。

+0

インジケータ列を1つずつ計算したことがありますか? – kitman0804

答えて

1

タスクは、二つのサブタスクに分割することができます。

  1. は、ワイドフォーマットに長いから作り直す
  2. 、購入のTIMESTAMP前に最新のRelease_Dateを見つけます。最新のリリースを見つけるための

data.tableパッケージには二つの可能性、

ローリングが

library(data.table) 
setDT(Version) 
setDT(Purchases) 

Version[Purchases, on = .(Release_Date = TIMESTAMP), roll = TRUE, 
     .(TIMESTAMP = i.TIMESTAMP, Amount, Version)] 
TIMESTAMP Amount Version 
1: 2013-11-14 15.44 1.2.3 
2: 2013-11-14 13.39 1.2.3 
3: 2013-11-14 15.35 1.2.3 
4: 2013-11-15 86.43 1.2.3 
5: 2014-01-15 12.30 1.3.1 
6: 2014-01-17 23.55 1.3.1 

非エクイ参加に参加しています

Version[Purchases, on = .(Release_Date <= TIMESTAMP), mult = "last", 
     .(TIMESTAMP = i.TIMESTAMP, Amount, Version)] 

これは、同じ結果をもたらす。

# rolling join 
Version[Purchases, on = .(Release_Date = TIMESTAMP), roll = TRUE, 
     .(TIMESTAMP = i.TIMESTAMP, Amount, Version)][ 
    , dcast(.SD, TIMESTAMP + Amount ~ Version, length)] 
TIMESTAMP Amount 1.2.3 1.3.1 
1: 2013-11-14 13.39  1  0 
2: 2013-11-14 15.35  1  0 
3: 2013-11-14 15.44  1  0 
4: 2013-11-15 86.43  1  0 
5: 2014-01-15 12.30  0  1 
6: 2014-01-17 23.55  0  1 

又は、場合列は

# non-equi join 
Version[Purchases, on = .(Release_Date <= TIMESTAMP), mult = "last", 
     .(TIMESTAMP = i.TIMESTAMP, Amount, Version)][ 
    , dcast(.SD, TIMESTAMP + Amount ~ paste0("Version_", Version), length)] 
整形中に変更されなければならない。整形について

は、dcast()機能が集約のためlength()で使用され

TIMESTAMP Amount Version_1.2.3 Version_1.3.1 
1: 2013-11-14 13.39    1    0 
2: 2013-11-14 15.35    1    0 
3: 2013-11-14 15.44    1    0 
4: 2013-11-15 86.43    1    0 
5: 2014-01-15 12.30    0    1 
6: 2014-01-17 23.55    0    1