Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 定量时间序列数据,状态持续时间_R_Time Series_Sequence - Fatal编程技术网

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