2017-02-09 6 views
4

データでロール参加するには、NAのdata.table

Usage <- structure(list(feature = c("M11", "M11", "M11", "M11", "M11", "M11", "M11"), 
         startDate = structure(c(17130, 17130, 17130, 17130,17155, 17155, 17155), class = "Date"), 
         cc = c("X6", "X6", "X6", "X6", "X6", "X6", "X6"), vendor = c("Z1", "Z1", "Z1", "Z1", "Z1","Z1", "Z1")), .Names = c("feature", "startDate", "cc", "vendor"), 
        row.names = c(NA,-7L), class = c("data.table", "data.frame")) 


Limits <- structure(list(vendorId = c("Z1", "Z1", "Z1", "Z1", "Z1", "Z1"), 
         featureId = c("M11", "M11", "M11", "M11", "M11", "M11"), 
         costcenter = c("X6", "X6", "X6", "X6", "X6", "X6"), 
         oldLimit = c(1L,2L, 3L, 4L, 5L, 6L), date = structure(c(17135, 17105, 17074, 17044, 17149, 17119), class = "Date")), 
        .Names = c("vendorId", "featureId","costcenter",  "oldLimit", "date"), row.names = c(NA, -6L), class = "data.frame") 

    setDT(Usage) 
    setDT(Limits) 

IAMのは「限界」dtのを見て、DT「使用法」にコラム「リミット」を追加しようとしています。これは、対応する使用時に、その "フィーチャー"、 "コストセンター"、 "ベンダー"の組み合わせの制限を調べることです。

しかし、以下のコードを使用してロール結合しようとすると、私は奇妙な結果を得ます。私は自分のデータのために多くのNAsを取得するので、上記のようにサンプルデータを作成しました。以下は私のロールジョインコードです。

Usage[Limits, limitAtStartDate:= i.oldLimit, on=c(cc="costcenter",feature="featureId", 
            vendor="vendorId", startDate="date"), roll=T,verbose=T] 

> Usage 
    feature startDate cc vendor limitAtStartDate 
1:  M11 2016-11-25 X6  Z1    6 
2:  M11 2016-11-25 X6  Z1    NA 
3:  M11 2016-11-25 X6  Z1    NA 
4:  M11 2016-11-25 X6  Z1    NA 
5:  M11 2016-12-20 X6  Z1    5 
6:  M11 2016-12-20 X6  Z1    NA 
7:  M11 2016-12-20 X6  Z1    NA 

はなぜ「5」&「6」は、私はすべての日付2016年12月20日と6にすべての行の5を期待しています「limitAtStartDate」に1つのレコード?

にのみ設定されているということです2016年11月25日。私はdata.tableバージョン1.10.0を使用しています。IAMのは間違っている私に知らせてください。

+0

私はあなたがそれを逆にしていると思います。 'setDT(Usage);を忘れないようにしてください。また、' setDT(Usage);忘れないでください。 setDT(制限) ' –

+0

@DavidArenburgこれに感謝します。適切なsetDT()で質問と結果を更新しました。しかし、私は後で正しいDT構造を得られないので、逆に参加したくない。 – pauljeba

+1

私はあなたに必要な値を得ました。 'Usage'テーブルに戻すことができます。例えば。 '使用法[、limitAtStartDate:=制限[使用法、oldLimit、on =(コストセンター= cc、featureId =機能、ベンダーID =ベンダー、日付=開始日)、ロール= TRUE]] ' –

答えて

2

X[Y]を実行する場合は、あなたが基本的に何をしているかdata.tableに参加するあなたは、Yに各値のためでありますXの値を見つけようとすると、結果として得られる結合の長さはYのテーブル。あなたの場合、Usageの値ごとにLimitsの値を見つけようとしており、長さ7のベクトルが得られます。したがって、あなたはおそらく他の方法で回避に参加する必要があり、その後側の注意点としてはLimits

Limits[Usage, 
     oldLimit, 
     on = .(costcenter = cc, featureId = feature, vendorId = vendor, date = startDate), 
     roll = TRUE] 
## [1] 6 6 6 6 5 5 5 

に戻ってそれを保存、非常に(といくつかの回ではないので)単純なケースのためにあなただけfindIntervalを使用することができます。

setorder(Limits, date)[findInterval(Usage$startDate, date), oldLimit] 
## [1] 6 6 6 6 5 5 5 

あなたが最初の区間ベクトルをソートする必要が

  • けれどもこれは、いくつかの注意点があり、非常に効率的な機能です。
  • はあなたがdata.tableで行うように簡単にロール間隔を設定することはできません(例えばroll = 2だけではなくroll = TRUE
  • 、おそらく最大の欠点は、一度に複数の変数に参加するローリングを実行するのが難しいだろうということです(ループを伴わずに)data.table
関連する問題