我有一个包含多个主题(id
)和重复观测值(以时间time
记录)的数据框。每个时间可能与事件(event
)相关联,也可能不相关。可以使用以下代码生成示例数据框:
set.seed(12345)
id <- c(rep(1, 9), rep(2, 9), rep(3, 9))
time <- c(seq(from = 0, to = 96, by = 12),
seq(from = 0, to = 80, by = 10),
seq(from = 0, to = 112, by = 14))
random <- runif(n = 27)
event <- rep(100, 27)
df <- data.frame(cbind(id, time, event, random))
df$event <- ifelse(df$random < 0.55, 0, df$event)
df <- subset(df, select = -c(random))
df$event <- ifelse(df$time == 0, 100, df$event)
我希望能够计算事件之间的时间差(
tae
[time after the last event]),理想输出如下:head(ideal_df)
id time event tae
1 1 0 100 0
2 1 12 100 0
3 1 24 100 0
4 1 36 100 0
5 1 48 0 12
6 1 60 0 24
在Fortran中,我使用以下代码来创建
tae
变量:IF(EVENT.GT.0) THEN
TEVENT = TIME
TAE = 0
ENDIF
IF(EVENT.EQ.0) THEN
TAE = TIME - TEVENT
ENDIF
在R中,我尝试过使用
ifelse
和dplyr
两种方法。然而,两者都不能产生我想要的输出。# Calculate the time since last event (using ifelse)
df$tae <- ifelse(df$event >= 0, df$tevent = df$time & df$tae = 0, df$tae = df$time - df$tevent)
Error: unexpected '=' in "df$tae <- ifelse(df$event >= 0, df$tevent ="
# Calculate the time since last event (using dplyr)
res <- df %>%
arrange(id, time) %>%
group_by(id) %>%
mutate(tae = time - lag(time))
res
id time event tae
1 1 0 100 NA
2 1 12 100 12
3 1 24 100 12
4 1 36 100 12
5 1 48 0 12
6 1 60 0 12
显然,这两种方法都无法产生我想要的输出。似乎在
ifelse
函数中分配变量不被R所容忍。我尝试使用dplyr
解决方案,但没有考虑到event
变量...最后,还需要记录下一个事件的时间
tue
。如果有人能够想到如何进行这个(可能更棘手的)计算,请随时分享。任何关于如何使其中之一工作(或替代解决方案)的想法都将不胜感激。谢谢!
附:当
ID
内的事件间隔发生变化时,以下是一个可重现的示例:id <- rep(1, 9)
time <- c(0, 10, 22, 33, 45, 57, 66, 79, 92)
event <- c(100, 0, 0, 100, 0, 100, 0, 0, 100)
df <- data.frame(cbind(id, time, event))
head(df)
id time event
1 1 0 100
2 1 10 0
3 1 22 0
4 1 33 100
5 1 45 0
6 1 57 100
tmp2
,你应该在select(-tmp, -tmp2)
之前插入ungroup()
。 - Jaaprev(cumsum(...))
函数将无法产生正确的结果。请参见我在上面帖子中的编辑,以获取可重现的示例。 - Entropy