這里有一項艱巨的任務和一項更艱巨的任務......
所以假設有一個資料集如下:
DF1
ID source timestamp
001 D 3/17/2021 1:22:10 AM
002 A 1/02/2021 8:25:20 AM
002 A 5/17/2021 10:25:20 PM
003 B 5/11/2021 8:25:20 AM
003 D 5/17/2021 3:12:30 PM
004 A 5/17/2021 8:25:20 AM
004 B 5/17/2021 8:26:20 PM
004 C 5/17/2021 8:27:20 PM
注意:時間戳是一個 var 中的日期和時間)
我需要做的就是擁有一個新的資料框,它只是ID, SOURCE, AND TIMESTAMP最新條目的資料框。
最終結果應如下所示:
ID source timestamp
001 D 3/17/2021 1:22:10 AM
002 A 5/17/2021 10:25:20 PM
003 D 5/17/2021 3:12:30 PM
004 C 5/17/2021 8:27:20 PM
完全分開,我有這個資料集:
DF2
ID event timestamp
001 y 3/17/2021 1:23:10 AM
002 y 3/12/2021 12:25:20 PM
003 y 5/12/2021 1:12:30 PM
004 y 5/17/2021 8:26:30 AM
我想根據最新的 ID將 DF2 加入 DF1 。我的意思是,DF1 有 2 個條目用于ID = 002. 我希望 DF2 在 ID 上加入,但僅適用于最接近而不經過的時間戳。
最后結果:
ID source df1.1timestamp event
001 D 3/17/2021 1:22:10 AM y
002 A 1/02/2021 8:25:20 AM y
002 A 5/17/2021 10:25:20 PM
003 B 5/11/2021 8:25:20 AM y
003 D 5/17/2021 3:12:30 PM
004 A 5/17/2021 8:25:20 AM
004 B 5/17/2021 8:26:20 PM y
004 C 5/17/2021 8:27:20 PM
正如您在此處看到的,DF2中的事件與DF1 中的最新時間戳相結合。在 的情況下ID = 004,聯接發生在 上,5/17/2021 8:26:20 PM因為在DF2 中,事件發生在 上5/17/2021 8:26:30 AM。5/17/2021 8:26:20 PM是DF1中緊接在事件之前的事件的行。
uj5u.com熱心網友回復:
這種型別的連接在 dplyr* 中不容易實作,所以這里有一個 data.table 解決方案。
讀入資料。將來請使用,dput以便用戶可以直接在他們的會話中獲取示例資料。
library(data.table)
df1 <- fread('
ID , source , timestamp
001 , D , 3/17/2021 1:22:10 AM
002 , A , 1/02/2021 8:25:20 AM
002 , A , 5/17/2021 10:25:20 PM
003 , B , 5/11/2021 8:25:20 AM
003 , D , 5/17/2021 3:12:30 PM
004 , A , 5/17/2021 8:25:20 AM
004 , B , 5/17/2021 8:26:20 PM
004 , C , 5/17/2021 8:27:20 PM
')
df2 <- fread('
ID , event , timestamp
001 , y , 3/17/2021 1:23:10 AM
002 , y , 3/12/2021 12:25:20 PM
003 , y , 5/12/2021 1:12:30 PM
004 , y , 5/17/2021 8:26:30 AM
')
# not required here, but would be if not read in as data.table
setDT(df1)
setDT(df2)
格式化日期時間并設定資料表的鍵
df1[, timestamp := as.POSIXct(timestamp, format = '%m/%d/%Y %r')]
df2[, timestamp := as.POSIXct(timestamp, format = '%m/%d/%Y %r')]
setkey(df1, ID, timestamp)
setkey(df2, ID, timestamp)
第1部分
df1[, tail(.SD, 1), ID]
#> ID source timestamp
#> 1: 1 D 2021-03-17 01:22:10
#> 2: 2 A 2021-05-17 22:25:20
#> 3: 3 D 2021-05-17 15:12:30
#> 4: 4 C 2021-05-17 20:27:20
第2部分:
df1[df2, event := i.event, on = .(ID), mult = 'first']
df1
#> ID source timestamp event
#> 1: 1 D 2021-03-17 01:22:10 y
#> 2: 2 A 2021-01-02 08:25:20 y
#> 3: 2 A 2021-05-17 22:25:20 <NA>
#> 4: 3 B 2021-05-11 08:25:20 y
#> 5: 3 D 2021-05-17 15:12:30 <NA>
#> 6: 4 A 2021-05-17 08:25:20 y
#> 7: 4 B 2021-05-17 20:26:20 <NA>
#> 8: 4 C 2021-05-17 20:27:20 <NA>
由reprex 包(v2.0.1)于 2021 年 9 月 30 日創建
* 雖然看起來很快:https : //github.com/tidyverse/dplyr/pull/5910
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/315234.html
上一篇:Rails嵌套連接-Rails4
