R 如何根据另一列中的值范围将时间序列数据分割为连续数据段
我想根据另一列的值将时间序列数据分成不同的段(每个段都是不同的数据帧)。例如:R 如何根据另一列中的值范围将时间序列数据分割为连续数据段,r,datetime,subset,segment,R,Datetime,Subset,Segment,我想根据另一列的值将时间序列数据分成不同的段(每个段都是不同的数据帧)。例如: #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))
#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”)
图书馆(lubridate)
df我们可以创建一个变量,在正值和负值之间分组,并进行分割。在您的例子中,我们创建一个逻辑向量df$water_level>=0
,其值大于或小于0。在它们之间创建顺序组的方法是,当差值不是0时,取差值的累积和,这意味着下一个值为FALSE(或TRUE)
这就给了,
所以简单地split(df,df$water_level>=0)
?@Sotos谢谢你的回答。实际上,我要求每个子集都有一个连续的时间序列,所以当水位为正时,数据集需要拆分到该点,然后再次开始检查水位是否为负,再次包含水位的所有连续负值,并在水位为正时再次拆分。在这种情况下,“拆分”数据并不能实现这一点,因为存在时间间隔。这很好。它起作用了。非常感谢你。但你认为你能解释“cumsum(c(真,差(df$water_level>=0)!=0)”是如何产生分组因子的吗?我不太确定这是如何工作的。是的,让我补充一些解释,所以试着把它分解并一点一点地运行。这将揭示它的工作方式精辟的解释!非常感谢你。是的,的确如此
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
...
...