【问题标题】:Fuzzy Merge 2 Data Frames on Time in rr中的时间模糊合并2个数据帧
【发布时间】:2017-05-19 16:22:21
【问题描述】:

我有两个需要合并的数据框。我要合并的字段是 IP 地址和时间 (%H:%M)。我在 IP 地址字段中寻找完全匹配,但在时间字段中我希望在 5 分钟 (+/-) 内进行模糊匹配。例如,如果我有以下 2 个数据框:

> df1
  users1 IPs1        times1
1  user1 192.168.1.1  11:05
2  user2 192.168.1.2  20:31
3  user3 192.168.1.3  01:19

> df2
  users2 IPs2         times2
1  userx 192.168.1.2  20:33
2  usery 192.168.1.3  01:19
3  userz 192.168.1.1  11:01

我想合并数据框以显示 user1 与 userz 相关,user2 与 userx 相关,user3 与 usery 相关。我怎么能那样做?使用合并功能,我只会根据确切的时间匹配获得 user3 与 usery 的相关性。

【问题讨论】:

  • 您能否在您的问题中添加预期的输出?
  • 您能否粘贴dput(df1)dput(df2) 的输出以获得易于重现的数据?

标签: r merge


【解决方案1】:

您可以使用fuzzyjoin 包进行模糊合并。 fuzzyjoin 函数之一是 difference_join,它允许您根据两个表中列之间的绝对差异进行连接。唯一的问题是,times1times2 是因子或字符向量,而不是数字。所以我使用hms 将它们转换为数字列,然后以 5 分钟(5*60 秒)的差异模糊连接,并在 IP 彼此相同时进行过滤。


library(tidyverse)
library(fuzzyjoin)
library(hms)

hms <- Vectorize(hms)
df1 <- df1 %>% 
  separate(times1, c("hours", "minutes")) %>%
  mutate_at(c("hours", "minutes"), as.integer) %>%
  mutate(times = hms(0, minutes, hours))

df2 <- df2 %>% 
  separate(times2, c("hours", "minutes")) %>%
  mutate_at(c("hours", "minutes"), as.integer) %>%
  mutate(times = hms(0, minutes, hours))


difference_full_join(df1, df2, by = "times", max_dist = 5*60) %>%
  filter(IPs1 == IPs2)
#>   users1        IPs1 hours.x minutes.x times.x users2        IPs2 hours.y
#> 1  user1 192.168.1.1      11         5   39900  userz 192.168.1.1      11
#> 2  user2 192.168.1.2      20        31   73860  userx 192.168.1.2      20
#> 3  user3 192.168.1.3       1        19    4740  usery 192.168.1.3       1
#>   minutes.y times.y
#> 1         1   39660
#> 2        33   73980
#> 3        19    4740

【讨论】:

  • 谢谢!对不起,我花了这么长时间才回复你,但生活发生在这周。这非常有效(在我发现我已将数据字符串作为因子导入之后)。感谢您的帮助,这确实激励我继续学习更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
相关资源
最近更新 更多