R:

2016-08-19 9 views
1

以前と過去の行のインデックスと2つのデータフレームをマージすると、私はこのようなデータセットを考えてみましょう:R:

origin=data.frame(Date=as.Date(c("2016-08-05","2016-08-04","2016-08-03")), 
        L=c(1,2,3), 
        Type=c("H","L","H")) 

     Date L Type 
1 2016-08-05 1 H 
2 2016-08-04 2 L 
3 2016-08-03 3 H 

end=data.frame(Date=as.Date(c("2016-08-05","2016-08-04","2016-08-03","2016-08-02","2016-08-01")), 
       N=c(50,40,30,20,10), 
       Name=c("CA","CB","CC","CD","CE"), 
       Vol=c(2,1,2,2,3), 
       Act=c(0.1,0.2,0.3,0.2,0.2)) 

     Date N Name Vol Act 
1 2016-08-05 50 CA 2 0.1 
2 2016-08-04 40 CB 1 0.2 
3 2016-08-03 30 CC 2 0.3 
4 2016-08-02 20 CD 2 0.2 
5 2016-08-01 10 CE 3 0.2 

私はこのような何かしたい:私は維持したい

 Date L Type N Name Vol Act 
3 2016-08-05 1 H 50 CA 2 0.1 
3 2016-08-05 1 H 40 CB 1 0.2 
3 2016-08-05 1 H 30 CC 2 0.3 
2 2016-08-04 2 L 40 CB 1 0.2 
2 2016-08-04 2 L 30 CC 2 0.3 
2 2016-08-04 2 L 20 CD 2 0.2 
1 2016-08-03 3 H 30 CC 2 0.3 
1 2016-08-03 3 H 20 CD 2 0.2 
1 2016-08-03 3 H 10 CE 3 0.2 

を元の列の日付を「origin」とし、マージでは、ループのマージのような、現在の日付と前の日付の値「end」(前の2つの値)をマージします。

非常に異なっており、現在および以前の行の値によって、2つのデータフレームをマージしません
merge(x = origin, y = end, by = "Date") 

     Date L Type N Name Vol Act 
1 2016-08-03 3 H 30 CC 2 0.3 
2 2016-08-04 2 L 40 CB 1 0.2 
3 2016-08-05 1 H 50 CA 2 0.1 

ので、私は:他の記事では、唯一の共通の値が3行が結果与える、一致していますこれについてどうやって行くのか分かりません。

答えて

1

data.tableからfoverlapsのように見えるが、この仕事のためのスーツです:

# prepare data and add extra columns for foverlaps join which relies on columns instead of one 
library(data.table) 
setDT(origin)[, DateStart := Date - 2] 
setDT(end)[, DateStart := Date] 
setkey(origin, DateStart, Date) 

# join two tables with foverlaps and remove subsidiary columns 
foverlaps(end, origin, type = "within")[, `:=` (DateStart = NULL, i.Date = NULL, i.DateStart = NULL)][order(Date)] 

#   Date L Type N Name Vol Act 
# 1: 2016-08-03 3 H 30 CC 2 0.3 
# 2: 2016-08-03 3 H 20 CD 2 0.2 
# 3: 2016-08-03 3 H 10 CE 3 0.2 
# 4: 2016-08-04 2 L 40 CB 1 0.2 
# 5: 2016-08-04 2 L 30 CC 2 0.3 
# 6: 2016-08-04 2 L 20 CD 2 0.2 
# 7: 2016-08-05 1 H 50 CA 2 0.1 
# 8: 2016-08-05 1 H 40 CB 1 0.2 
# 9: 2016-08-05 1 H 30 CC 2 0.3 

またはnon-equiを使用data.tableバージョン1.9.7の特徴参加:子会社列を削除

setDT(origin)[, `:=` (DateEnd = Date, StartDate = Date - 2)] 
      [setDT(end), on = .(DateEnd >= Date, StartDate <= Date), allow = T] 

#   Date L Type DateEnd StartDate N Name Vol Act 
# 1: 2016-08-05 1 H 2016-08-05 2016-08-05 50 CA 2 0.1 
# 2: 2016-08-04 2 L 2016-08-04 2016-08-04 40 CB 1 0.2 
# 3: 2016-08-05 1 H 2016-08-04 2016-08-04 40 CB 1 0.2 
# 4: 2016-08-03 3 H 2016-08-03 2016-08-03 30 CC 2 0.3 
# 5: 2016-08-04 2 L 2016-08-03 2016-08-03 30 CC 2 0.3 
# 6: 2016-08-05 1 H 2016-08-03 2016-08-03 30 CC 2 0.3 
# 7: 2016-08-03 3 H 2016-08-02 2016-08-02 20 CD 2 0.2 
# 8: 2016-08-04 2 L 2016-08-02 2016-08-02 20 CD 2 0.2 
# 9: 2016-08-03 3 H 2016-08-01 2016-08-01 10 CE 3 0.2 

を簡単です。

+1

これは実際に私の問題を解決しました。しかし、私がここで提案したデータフレームが問題を完全に反映していなかったことに気付きませんでした。実際には、2つのデータフレームをマージする必要がありますが、2番目のデータフレームは複数の列(最大10)を持ち、5つまでのラグが必要です。だから私はその事件を完全に反映させるために質問を整理しています。 – hachondeoro