如何根据另一列中的值范围将时间序列数据分成连续数据段
How can I separate time-series data into segments of continuous data according to a range of values in another column
我想根据另一列的值将时间序列数据分成不同的段(每个段都是不同的数据帧)。例如:
#Generate a data frame of hourly precipitation and water level.
install.packages("lubridate")
library(lubridate)
df<-data.frame(date_time=ymd_hms(seq(c(ISOdate(2000,3,20)), by = "hour", length.out = 365)), precip= sample(0:10,365,replace=T), water_level=sample(-50:50,365,replace=T)))
我想制作水位为负时的时间序列数据的子集,保持日期时间值不变(使用 lubridate 解析)以及该连续时间范围内的水位和降水量变量.
我们可以创建一个变量来对正值和负值进行分组,然后进行拆分。在您的例子中,我们创建了一个逻辑向量 df$water_level >= 0
,其值大于和小于 0。在它们之间创建顺序组的方法是取差异的累积和,当该差异不为 0 时,意味着下一个值是 FALSE(或 TRUE)。
split(df, cumsum(c(TRUE, diff(df$water_level >= 0) != 0)))
这给出了,
$`1`
date_time precip water_level
1 2000-03-20 12:00:00 8 45
$`2`
date_time precip water_level
2 2000-03-20 13:00:00 9 -12
$`3`
date_time precip water_level
3 2000-03-20 14:00:00 4 9
4 2000-03-20 15:00:00 0 13
5 2000-03-20 16:00:00 8 34
$`4`
date_time precip water_level
6 2000-03-20 17:00:00 1 -20
...
...
我想根据另一列的值将时间序列数据分成不同的段(每个段都是不同的数据帧)。例如:
#Generate a data frame of hourly precipitation and water level.
install.packages("lubridate")
library(lubridate)
df<-data.frame(date_time=ymd_hms(seq(c(ISOdate(2000,3,20)), by = "hour", length.out = 365)), precip= sample(0:10,365,replace=T), water_level=sample(-50:50,365,replace=T)))
我想制作水位为负时的时间序列数据的子集,保持日期时间值不变(使用 lubridate 解析)以及该连续时间范围内的水位和降水量变量.
我们可以创建一个变量来对正值和负值进行分组,然后进行拆分。在您的例子中,我们创建了一个逻辑向量 df$water_level >= 0
,其值大于和小于 0。在它们之间创建顺序组的方法是取差异的累积和,当该差异不为 0 时,意味着下一个值是 FALSE(或 TRUE)。
split(df, cumsum(c(TRUE, diff(df$water_level >= 0) != 0)))
这给出了,
$`1` date_time precip water_level 1 2000-03-20 12:00:00 8 45 $`2` date_time precip water_level 2 2000-03-20 13:00:00 9 -12 $`3` date_time precip water_level 3 2000-03-20 14:00:00 4 9 4 2000-03-20 15:00:00 0 13 5 2000-03-20 16:00:00 8 34 $`4` date_time precip water_level 6 2000-03-20 17:00:00 1 -20 ... ...