我正在 R 工作,我想为可以为个人打开和关闭治疗的情况创建一个相对时间索引。因此,索引将从某个负数向上计数,直到 0,此时处理变为 1,并且只要处理在重置之前保持为 1,索引就会向上计数。使用示例来解释我需要什么是最简单的。
假设我有如下所示的数据:
df <- data.frame(id = c(1,1,1,1,1,1,1,1,1,1,1,2,2,2,2), treatment = c(0,0,1,1,0,0,0,1,1,1,0,0,1,1,1))
我希望得到以下结果:
id treatment relative_time
1 1 0 -2
2 1 0 -1
3 1 1 0
4 1 1 1
5 1 0 -3
6 1 0 -2
7 1 0 -1
8 1 1 0
9 1 1 1
10 1 1 2
11 1 0 .
12 2 0 -1
13 2 1 0
14 2 1 1
15 2 1 2
我已经看到以下代码适用于每个人进行一次治疗的情况,但遗憾的是我无法找到一种方法来使其适应我的情况:
df %>%
group_by(id) %>%
mutate(relative_time = seq_along(treatment) - which(treatment %in% 1))
如有任何帮助,我们将不胜感激!
您可以使用
dplyr
库首先在每次值变化时分配一个组,然后在处理为1时对每个组进行排序0,1,2...(n-1)
,当处理为0时-n+0, -n+1, ... -1
,
library(dplyr)
df %>%
mutate(
g = cumsum(treatment != lag(treatment, default = TRUE)),
.by = id
) |>
mutate(
relative_time = seq_along(g) - 1 + ifelse(treatment, 0, -length(g)),
.by = c(id, g)
) |>
select(-g)
输出
id treatment relative_time
1 1 0 -2
2 1 0 -1
3 1 1 0
4 1 1 1
5 1 0 -3
6 1 0 -2
7 1 0 -1
8 1 1 0
9 1 1 1
10 1 1 2
11 1 0 -1
12 2 0 -1
13 2 1 0
14 2 1 1
15 2 1 2