[英]Merging dataframes by ranges of datetimes in R
我有兩個數據框。 第一個數據框Observations
顯示測量員記錄感興趣事件的日期/時間,以及每種事件類型的唯一ID
號:
library(lubridate)
Observations <- data.frame(Time = dmy_hms(paste(c("13-7-2022 10:01:01","13-7-2022 14:02:01","15-7-2022 10:01:01", "15-7-2022 16:01:01"))), ID = c(1,3,1))
第二個數據框Sites
顯示調查員開始和停止尋找事件的日期/時間(即,這描述了可能觀察到事件的時間)。 TimeStart
是調查員開始尋找事件的時間, TimeEnd
是他們停止的時間。 Sites
還包含測量員在TimeStart
和TimeEnd
之間尋找事件的緯度和經度。
Sites <- data.frame(TimeStart = dmy_hms(paste(c("13-7-2022 10:00:00","13-7-2022 14:00:00","15-7-2022 10:00:00", "15-7-2022 16:00:00"))),
TimeEnd = dmy_hms(paste(c("13-7-2022 10:05:00","13-7-2022 14:05:00","15-7-2022 10:05:00", "15-7-2022 16:05:00"))),
Latitude = c("11.1111", "11.2222", "11.1234", "11.1487"),
Longitude = c("99.1257", "99.3478", "99.6241", "99.6214"))
因此,測量員記錄事件的Time
(即記錄在Observations
中)屬於Sites$TimeStart
和Sites$TimeEnd
中顯示的時間范圍之一。
我想合並這兩個數據框,以便記錄在Observations
中的每個事件( ID
)的行包含測量員在相應Time
期間搜索的Latitude
和Longitude
,以及他們開始TimeStart
和停止TimeEnd
搜索每個時期的時間。
最后, Observations
看起來像這樣:
Time ID Latitude Longitude TimeStart TimeEnd
2022-07-13 10:01:01 1 11.1111 99.1257 2022-07-13 10:00:00 2022-07-13 10:05:00
2022-07-13 14:02:01 3 11.2222 99.3478 2022-07-13 14:00:00 2022-07-13 14:05:00
2022-07-15 10:01:01 2 11.1234 99.6241 2022-07-15 10:00:00 2022-07-15 10:05:00
2022-07-15 16:01:01 1 11.1487 99.6214 2022-07-15 16:00:00 2022-07-15 16:05:00
當Observations$Time
落在Sites$TimeStart
和Sites$TimeEnd
中顯示的“時間范圍”內時,我們如何按時間合並這些數據?
我們可以通過檢索Sites
中滿足時間條件的索引(行號)來做到這一點:
Observations$siteindex <- sapply(Observations$Time, function(x) which(x<=Sites$TimeEnd&x>=Sites$TimeStart)[1]) # first matching row into Sites
Sites$siteindex <- 1:nrow(Sites)
result <- merge(Observations, Sites, by="siteindex")
siteindex Time ID TimeStart TimeEnd Latitude Longitude
1 1 2022-07-13 10:01:01 1 2022-07-13 10:00:00 2022-07-13 10:05:00 11.1111 99.1257
2 2 2022-07-13 14:02:01 3 2022-07-13 14:00:00 2022-07-13 14:05:00 11.2222 99.3478
3 3 2022-07-15 10:01:01 1 2022-07-15 10:00:00 2022-07-15 10:05:00 11.1234 99.6241
4 4 2022-07-15 16:01:01 2 2022-07-15 16:00:00 2022-07-15 16:05:00 11.1487 99.6214
數據可能有點不同,因為您的data.frame
不正確: arguments imply differing number of rows: 4, 3
:4、3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.