R 中治疗顺序的相对时间指数

问题描述 投票:0回答:1

我正在 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))

如有任何帮助,我们将不胜感激!

r dplyr
1个回答
0
投票

您可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.