我确信这并不难,但我无法找到一种方法来总结每小时的繁殖时间。我有成千上万的鸟类事件数据(繁殖)到达(AR)并离开(LV)它们的巢穴。到达和离开事件的相应时间是及时给出的,如下所示:
times = as.POSIXct(c("2007-07-11 22:47:21 UTC", "2007-07-11 22:58:39 UTC", "2007-07-11 22:58:48 UTC", "2007-07-11 23:57:45 UTC", "2007-07-12 02:29:52 UTC", "2007-07-12 03:46:23 UTC", "2007-07-12 03:46:36 UTC", "2007-07-12 04:28:54 UTC", "2007-07-12 04:29:03 UTC", "2007-07-12 05:36:38 UTC"), tz = "UTC")
breeding = c("AR", "LV", "AR", "LV", "AR", "LV", "AR", "LV", "AR", "OFF")
现在我想根据这些每小时的休息计算鸟类在巢穴上每小时的分数
cut(times, breaks = "hour")
只有右端也应包括在内。
我尝试用 difftime 总结,但当然它并没有在时间和日期中断。所以结果看起来应该是这样的:
Hour fraction
22-23 12min
23-00 57min
00-01 0min
01-02 0min
02-03 31min
03-04 46min
04-05 1min
05-06 24min
非常感谢!!
答案 0 :(得分:0)
来自dplyr
,tidyr
和lubridate
的解决方案。
我们可以按如下方式计算时差
library(dplyr)
library(tidyr)
library(lubridate)
dt2 <- dt %>%
mutate(breeding = ifelse(breeding %in% "OFF", "LV", breeding)) %>%
mutate(ID = rep(1:(n()/2), each = 2)) %>%
spread(breeding, times) %>%
mutate(DiffTime = difftime(LV, AR, "mins"))
dt2
ID AR LV DiffTime
1 1 2007-07-11 22:47:21 2007-07-11 22:58:39 11.30000 mins
2 2 2007-07-11 22:58:48 2007-07-11 23:57:45 58.95000 mins
3 3 2007-07-12 02:29:52 2007-07-12 03:46:23 76.51667 mins
4 4 2007-07-12 03:46:36 2007-07-12 04:28:54 42.30000 mins
5 5 2007-07-12 04:29:03 2007-07-12 05:36:38 67.58333 mins
如果您想知道该日期的小时,我们可以进一步提取日期和小时信息,如下所示。
dt3 <- dt2 %>%
mutate(AR_Date = as.Date(AR), LV_Date = as.Date(LV),
AR_Hour = hour(AR), LV_Hour = hour(LV))
dt3
从这里,您可以决定如何进一步总结您的数据。
ID AR LV DiffTime AR_Date LV_Date AR_Hour LV_Hour
1 1 2007-07-11 22:47:21 2007-07-11 22:58:39 11.30000 mins 2007-07-11 2007-07-11 22 22
2 2 2007-07-11 22:58:48 2007-07-11 23:57:45 58.95000 mins 2007-07-11 2007-07-11 22 23
3 3 2007-07-12 02:29:52 2007-07-12 03:46:23 76.51667 mins 2007-07-12 2007-07-12 2 3
4 4 2007-07-12 03:46:36 2007-07-12 04:28:54 42.30000 mins 2007-07-12 2007-07-12 3 4
5 5 2007-07-12 04:29:03 2007-07-12 05:36:38 67.58333 mins 2007-07-12 2007-07-12 4 5
答案 1 :(得分:0)
试试这个!我真的想提出一个答案,因为这很有趣,我可以看到自己使用类似的东西。我认为它很接近。
看看你的想法!
看起来像这样:
Date hours Total
1: 2007-07-11 22 01:10:15
2: 2007-07-12 2 01:16:31
3: 2007-07-12 3 00:42:18
4: 2007-07-12 4 01:07:35
所以,在22:00,他们将花费一个多小时。这些鸟直到凌晨2点才到达,也将花费一个多小时。
最终输出位于times
。
#---Load the required libraries
require(chron) #---For time manipulation
require(data.table) #---Calculate and store data.tables
require(splitstackshape) #---Split columns by a delimiter
#---Input Data
times = as.POSIXct(c("2007-07-11 22:47:21 UTC", "2007-07-11 22:58:39 UTC", "2007-07-11 22:58:48 UTC", "2007-07-11 23:57:45 UTC", "2007-07-12 02:29:52 UTC", "2007-07-12 03:46:23 UTC", "2007-07-12 03:46:36 UTC", "2007-07-12 04:28:54 UTC", "2007-07-12 04:29:03 UTC", "2007-07-12 05:36:38 UTC"), tz = "UTC")
breeding = c("AR", "LV", "AR", "LV", "AR", "LV", "AR", "LV", "AR", "OFF")
#---The times need to be a data.table for cSplit to work
times <- as.data.table(times)
#---This splits your time input into "Date" and "Time" columns
times <- cSplit(times, "x", sep = " ")
setnames(times, c("x_1", "x_2"),c("Date", "Time"))
times[] <- lapply(times, as.character)
#---Bring in "AR" or "LV" into a fresh data.table
Data <- cbind(times, breeding)
#---Format the time column for computation
Data$Time <- chron(times = Data$Time, format = 'h:m:s')
#rm(times,breeding)
#---Arrival times
arrive <- Data[breeding == "AR",]
setnames(arrive, c("Time"), c("ArriveTime"))
arrive[,3] <- NULL
#---Departure times
leave <- Data[breeding != "AR",]
setnames(leave, c("Time"), c("LeaveTime"))
leave[,c(1,3)] <- NULL
#---But them together
times <- cbind(arrive, leave)
#rm(arrive, leave)
#---Calculate elapsed times
times <- times[, Elapsed := LeaveTime - ArriveTime]
#rm(times3,Data)
#---Sum elapsed time by the hour of the Arrival time
times <- times[, .(Total = sum(Elapsed)), by = .(Date,hours(ArriveTime))]
times