3

R に 2 つのデータ フレームがあり、それらを条件付きでマージしたいと思いidますday。マージとは、right変数にマージされるleft変数が可能な限り新しい/新鮮/最新であることですが、少なくとも 3 日経過している必要があります。

rightしかし、私のidペアdateに一致するものがない場合でも、leftそれらを保持したいと思います。id私の調査には 2 つの部分があるので、完全ではないという理由だけで-のday観察を省略したくありません。

これをワンsqldfステップで実行できますか? 私の現在のアプローチには、追加のベース R が必要mergeです。

left <- data.frame(id=rep(1:5, each=10),
                   day=rep(1:10, times=5),
                   x=rnorm(5*10))
right <- data.frame(id=rep(1:2, each=21),
                   day=rep(-10:10, times=2),
                   y=rnorm(2*21))
combined <- sqldf("SELECT L.id, L.day, L.x, R.y
                  FROM left L LEFT OUTER JOIN right R
                  ON (L.id = R.id)
                  WHERE ((L.day - R.day) >= 3)
                  GROUP BY L.id, L.day
                  HAVING (R.day = MAX(R.day))")
combined                  

combined.2 <- merge(left, combined, all=TRUE)
combined.2 
4

2 に答える 2

5

次のように選択ステートメントをネストしてみてください。

sqldf("SELECT * from left
       LEFT JOIN (SELECT id, L.day, L.x, R.y
                  FROM left L LEFT OUTER JOIN right R
                  USING (id)
                  WHERE ((L.day - R.day) >= 3)
                  GROUP BY L.id, L.day
                  HAVING (R.day = MAX(R.day))) 
       USING (id, day, x)")

これは、次のようにして行うこともできます。max が使用される場合、同じ結果行の他の値は max と同じ元の行から取得されることが保証されるという事実を使用します。これは、SQLite が提供する SQL の拡張機能です。

sqldf("select max(R.day) as maxRday, L.*, R.y
  from left L left outer join right R
  on L.id = R.id and L.day - R.day >= 3
  group by L.id, L.day")[-1]
于 2014-04-05T12:39:27.947 に答える