R 定量时间序列数据,状态持续时间
我有一个带有时间变量和定性变量的纵向数据集。我的主体可以处于三种状态之一,有时状态改变,有时保持不变 我想产生的是一个新的数据帧,它为我提供了每次主体处于某个状态时,它第一次处于该状态的时间,以及主体在该状态下停留的时间。我之所以想这样做,是因为我的最终目标是观察不同治疗方法的状态切换是否频繁发生,每个状态的状态长度是否不同,状态长度是否随时间而变化,等等 示例数据:R 定量时间序列数据,状态持续时间,r,time-series,sequence,R,Time Series,Sequence,我有一个带有时间变量和定性变量的纵向数据集。我的主体可以处于三种状态之一,有时状态改变,有时保持不变 我想产生的是一个新的数据帧,它为我提供了每次主体处于某个状态时,它第一次处于该状态的时间,以及主体在该状态下停留的时间。我之所以想这样做,是因为我的最终目标是观察不同治疗方法的状态切换是否频繁发生,每个状态的状态长度是否不同,状态长度是否随时间而变化,等等 示例数据: set.seed(1) Data=data.frame(time=1:100,State=sample(c('a','b','c
set.seed(1)
Data=data.frame(time=1:100,State=sample(c('a','b','c'),100,replace=TRUE))
前几行数据如下所示
我想制作这个:
我可能可以通过while循环来实现这一点,但这似乎非常低效,特别是因为我的实际数据是每个主题700000行。有更好的方法吗?可能是用diff函数和%表示的。我想不出来
set.seed(1)
Data=data.frame(time=1:100,State=sample(c('a','b','c'),100,replace=TRUE))
将data.table与该大小的数据一起使用:
library(data.table)
setDT(Data)
head(Data)
# time State
#1: 1 a
#2: 2 b
#3: 3 b
#4: 4 c
#5: 5 a
#6: 6 c
给每个州运行一个编号:
Data[, state_run := cumsum(c(TRUE, diff(as.integer(Data$State)) != 0L))]
#Note that this assumes that State is a factor variable
查找每个状态运行的相关值:
Data2 <- Data[, list(StartTime = min(time),
State = State[1],
Duration = diff(range(time)) + 1), by = state_run]
head(Data2)
# state_run StartTime State Duration
#1: 1 1 a 1
#2: 2 2 b 2
#3: 3 4 c 1
#4: 4 5 a 1
#5: 5 6 c 2
#6: 6 8 b 2
Data2
Data[, state_run := cumsum(c(TRUE, diff(as.integer(Data$State)) != 0L))]
#Note that this assumes that State is a factor variable
Data2 <- Data[, list(StartTime = min(time),
State = State[1],
Duration = diff(range(time)) + 1), by = state_run]
head(Data2)
# state_run StartTime State Duration
#1: 1 1 a 1
#2: 2 2 b 2
#3: 3 4 c 1
#4: 4 5 a 1
#5: 5 6 c 2
#6: 6 8 b 2