如何根据另一列中的值范围将时间序列数据分为连续数据段

问题描述 投票:0回答:1

我想根据另一列的值将时间序列数据分为不同的段(每个段都是不同的数据框)。例如:

#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进行分析)以及该连续时间范围内的水位和降水量变量。

r datetime subset segment
1个回答
1
投票

我们可以创建一个变量以在正值和负值之间进行分组,然后拆分。在您的情况下,我们创建一个逻辑向量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
...
...
© www.soinside.com 2019 - 2024. All rights reserved.