[英]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
,並且df1
和df2
之間的時間戳Datetime
的時間差小於或等於給定值。
所以,對於給定的樣本數據
df2
兩行。ID == 456
的df2
的第二行。df2
的行df2
滿足條件。一種可能的方法是使用非對等連接,該連接可用於data.table :
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。
df1
和df2
Datetime
根據OP 的要求,這里有一個版本,它從df1
和df2
返回兩個Datetime
列,分別重命名為Datetime1
和Datetime2
,分別為:
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.