我有一个带有时间变量和定性变量的纵向数据集。我的主题可以处于三种状态之一,有时状态发生变化,有时它保持不变。
我想要产生的是一个新的数据框,它给出了我,每当一个主体处于一个状态,它在该状态的第一个时间以及主体保持在同一状态的时间。我想这样做是因为我的最终目标是看看状态切换是否会针对不同的处理更多/更少地发生,状态长度因状态而异,状态长度随时间变化等等。
示例数据:
set.seed(1)
Data=data.frame(time=1:100,State=sample(c('a','b','c'),100,replace=TRUE))
数据的前几行看起来像这样
time State 1 1 a 2 2 b 3 3 b 4 4 c 5 5 a 6 6 c 7 7 c
我想产生这个:
StartTime State Duration 1 1 a 1 2 2 b 2 3 4 c 1 4 5 a 1 5 6 c 2
我可以通过while循环实现这一点,但这似乎非常低效,特别是因为我的实际数据是每个主题700000行。有没有更好的方法呢?也许是diff-function和%in%的东西。我无法弄明白。
答案 0 :(得分:1)
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