簡體   English   中英

在 R 中將兩個數據框與兩列 [日期時間列之一] 連接起來

[英]Join two dataframe with two columns [ one of datetime column ] in R

我有兩個 df,我試圖根據兩列向左或向右加入它們。 ID 和日期時間列。 即使它在 10-20 秒的差異范圍內,我如何允許來自另一個 df 的 DateTime 匹配第一個 df?

df1:

ID 約會時間
123 2021-04-02 09:50:11
456 2021-04-02 09:50:15

df2:

ID 約會時間
123 2021-04-02 09:50:31
456 2021-04-02 09:50:23

如果 df2 上的時間在 10-20 差異之內,則將 df2 中的所有列和 DateTime 列返回到 new,df3。 對於所有匹配的 ID 和 yyyy-mm-dd H:M 匹配兩個 dfs。 所以如果 :SS 在 df2 上的變化在 10-20 之間,選擇它並加入,如果它不在 10-20 秒范圍內,則跳過。 有人,請幫忙?

您的示例數據非常簡約。 不確定你是如何實現 10-20 秒的。 我假設 -20 到 +20 秒內的所有內容都應該匹配。 這可以在過濾部分ID == i.ID & Datetime <= (i.Datetime + 20) & Datetime >= (i.Datetime - 20)輕松調整。

這是一個data.table方法

library(data.table)
# Sample data
DT1 <- fread("ID    Datetime
123     2021-04-02T09:50:11
456     2021-04-02T09:50:15")
DT2 <- fread("ID    Datetime
123     2021-04-02T09:50:31
456     2021-04-02T09:50:23")
# Set datetimes to posix
DT1[, Datetime := as.POSIXct(Datetime)]
DT2[, Datetime := as.POSIXct(Datetime)]

# possible rowwise approach
DT1[, rowid := .I]
setkey(DT1, rowid)
DT1[DT1, Datetime2 := DT2[ID == i.ID & Datetime <= (i.Datetime + 20) & Datetime >= (i.Datetime - 20),
                          lapply(.SD, paste0, collapse = ";"), .SDcols = c("Datetime")],
    by = .EACHI][, rowid := NULL][]

#     ID            Datetime           Datetime2
# 1: 123 2021-04-02 09:50:11 2021-04-02 09:50:31
# 2: 456 2021-04-02 09:50:15 2021-04-02 09:50:23

如果我理解正確,OP 想要檢索df2那些行(包括所有列),這些行在df1具有匹配的ID並且df1df2之間的時間戳Datetime的時間差小於或等於給定值。

所以,對於給定的樣本數據

  • 如果允許的時間差最多為 20 秒,則返回df2兩行。
  • 如果允許的時間差最多為 10 秒,則僅返回ID == 456df2的第二行。
  • 如果允許的時間差最多為 5 秒,則返回空數據集,因為df2的行df2滿足條件。

一種可能的方法是使用非對等連接,該連接可用於

library(data.table)
timediff <- 10 # given time difference in seconds
setDT(df1)[, Datetime := as.POSIXct(Datetime)] 
setDT(df2)[, Datetime := as.POSIXct(Datetime)]
df2[, c("from", "to") := .(Datetime - timediff, Datetime + timediff)]
df3 <- df2[df1, on = c("ID", "from <= Datetime", "to >= Datetime"), 
           nomatch = NULL, .SD][
             , c("from", "to") := NULL][]
df3
 ID Datetime 1: 456 2021-04-02 09:50:23

如果代碼運行

timediff <- 20

結果是

df3
 ID Datetime 1: 123 2021-04-02 09:50:31 2: 456 2021-04-02 09:50:23

如果代碼運行

timediff <- 5

df3變成一個空的 data.table。

編輯:顯示來自df1df2 Datetime

根據OP 的要求,這里有一個版本,它從df1df2返回兩個Datetime列,分別重命名為Datetime1Datetime2 ,分別為:

library(data.table)
timediff <- 20 # given time difference in seconds
setDT(df1)[, Datetime := as.POSIXct(Datetime)] 
setDT(df2)[, Datetime := as.POSIXct(Datetime)]
df2[, c("from", "to") := .(Datetime - timediff, Datetime + timediff)]
df3 <- df2[setDT(df1), on = c("ID", "from <= Datetime", "to >= Datetime"), 
           nomatch = NULL, .(ID, Datetime1 = i.Datetime, Datetime2 = x.Datetime)]
df3
 ID Datetime1 Datetime2 1: 123 2021-04-02 09:50:11 2021-04-02 09:50:31 2: 456 2021-04-02 09:50:15 2021-04-02 09:50:23

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM