簡體   English   中英

在 R 中按日期時間范圍合並數據幀

[英]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還包含測量員在TimeStartTimeEnd之間尋找事件的緯度和經度。

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$TimeStartSites$TimeEnd中顯示的時間范圍之一。

我想合並這兩個數據框,以便記錄在Observations中的每個事件( ID )的行包含測量員在相應Time期間搜索的LatitudeLongitude ,以及他們開始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$TimeStartSites$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.

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