web-dev-qa-db-ja.com

2列間の条件に基づいてデータフレームを結合する方法

2つのデータフレームをマージする必要があるプロジェクトで立ち往生しています。それらは次のようになります。

Data1
Traffic Source    Registrations    Hour    Minute
organic           1                6        13
social            1                8        54

Data2
Email                     Hour2   Minute2
[email protected]           6         13
[email protected]         8         55

2つのデータフレームをマージする次のコード行があります。

merge.df <- merge(Data1, Data2, by.x = c( "Hour", "Minute"),
           by.y = c( "Hour2", "Minute2"))

可変時間(時間と分)が2つのデータセット間でわずかにずれていなければ、うまくいきます。 +または-1分ずれている場合、列「Minute」を「Minute2」と一致させる方法はありますか?

データセット1に対して2つの新しい列を作成できると思いました。

Data1
Traffic Source    Registrations   Hour   Minute    Minute_plus1   Minute_minus1
organic           1               6        13      14              12
social            1               8        54      55              53

「Minute2」が「Minute」、「Minute_plus1」、または「Minute_minus1」のいずれかの変数と一致する場合、2つのデータフレームをマージすることは可能ですか?または、このマージを達成するためのより効率的な方法はありますか?

11
heyydrien

このようなことについては、私は通常SQLを使用します。

library(sqldf)
x = sqldf("
  SELECT *
  FROM Data1 d1 JOIN Data2 d2
  ON d1.Hour = d2.Hour2
  AND ABS(d1.Minute - d2.Minute2) <= 1
")

データのサイズによっては、Hourで結合してからフィルタリングすることもできます。 dplyrの使用:

library(dplyr)
x = Data1 %>%
  left_join(Data2, by = c("Hour" = "Hour2")) %>%
  filter(abs(Minute - Minute2) <= 1)

ただし、base関数を使用して同じことを行うことができます。

14
Gregor