如何根据2列之间的条件连接数据帧

hey*_*ien 9 merge r dataframe

我遇到了一个需要合并两个数据框的项目.他们看起来像这样:

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

Data2
Email                     Hour2   Minute2
test@domain.com           6         13
test2@domain2.com         8         55
Run Code Online (Sandbox Code Playgroud)

我有以下代码行来合并2个数据帧:

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

如果两个数据集之间的可变时间(小时和分钟)没有略微偏离,那将会很有效.有没有办法让列"分钟"与"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
Run Code Online (Sandbox Code Playgroud)

如果"Minute2"匹配"Minute","Minute_plus1"或"Minute_minus1"中的任何变量,是否可以合并2个数据帧?或者是否有更有效的方法来完成此合并?

Gre*_*gor 14

对于像这样的东西我通常转向SQL:

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

根据数据的大小,您也可以加入Hour然后过滤.使用dplyr:

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

虽然你可以用base功能做同样的事情.

  • 也许`...在abs(60*d1.Hour + d1.Minute - 60*d2.Hour - d2.Minute)<= 1 (4认同)