玩具数据:
df <-
structure(list(datetime = structure(c(1692439200, 1692442800,
1692446400, 1692450000, 1692453600, 1692457200, 1692460800, 1692464400,
1692468000, 1692471600, 1692475200, 1692478800, 1692482400, 1692486000,
1692489600, 1692493200, 1692496800, 1692500400, 1692504000, 1692507600,
1692511200, 1692514800, 1692518400, 1692522000, 1692525600, 1692529200,
1692532800, 1692536400, 1692540000, 1692543600, 1692547200, 1692550800,
1692554400, 1692558000, 1692561600, 1692565200, 1692568800, 1692572400,
1692576000, 1692579600, 1692583200, 1692586800, 1692590400, 1692594000,
1692597600, 1692601200), tzone = "", class = c("POSIXct", "POSIXt"
)), var = c(30, 31.1, 31.2, NA, NA, NA, 26.9, 26.5, 25.6,
24.7, 24.5, 24.4, 23.6, 23.1, 22.7, 22, 21.3, 21, 20.9, 20.9,
22.8, 25.3, 26.2, 27.1, 28.1, 28.5, 28.8, 28.6, 28.1, 26.4, 24.7,
23.2, 23, 22.4, 21.5, 20.8, 19.9, 19.7, 20, 19.9, 19.8, 20.2,
21.7, 21.9, 23.6, 25.2)), row.names = c(NA, -46L), class = "data.frame")
变量var
按小时测量。
对于每一天,我的目标是计算一个指数变量,如果变量var
在前一天的下午6点(包括在内)和当天的早上6点(包括在内)之间大于某个值,比如20,则该指数变量为1。当然,其他方面也是零。
显然,我可以使用{dplyr}和{lubridate}中的函数来建立新的变量,这些变量可用于对时间范围进行分组和过滤,如
library(dplyr); library(lubridate)
df |>
mutate(date = lubridate::date(datetime),
hour = lubridate::hour(datetime))
但这并没有朝着正确的方向发展,因为相关的时间范围跨越了两个日期。我认为zoo::rollapply()
或类似的函数应该符合我的需要,但找不到类似的例子。df
到时间序列对象的转换不是我想要的。我愿意接受任何像{data.table}
方法这样的建议,而不限于{tidyverse}
解决方案。
1条答案
按热度按时间zmeyuzjn1#