【发布时间】:2014-12-20 15:06:02
【问题描述】:
我有一个包含多个主题 (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 [最后一个事件之后的时间]),这样理想的输出将如下所示:
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
显然,这些都没有产生我想要的输出。似乎 R 不能很好地容忍在 ifelse 函数中分配变量。我对 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
【问题讨论】:
标签: r if-statement time dplyr