我有一个纵向数据框,由多个 ID 和每个 ID 的多个观测值 (OBS) 组成。根据次数 (OCC),观察结果会用每个新剂量 (ADMIN) 进行标记:
ID TIME ADMIN OBS OCC
1 0 10 0 1
1 1 0 1000 1
1 8 0 560 1
1 12 0 203 1
1 24 10 56 2
1 32 0 674 2
1 36 0 457 2
2 0 20 0 1
2 12 0 144 1
2 24 20 32 2
2 36 0 97 2
2 48 20 199 3
2 60 0 120 3
我想在两次之间为每个 ID 创建行。该新行应包含前一行的 OCC 编号和下一行的 TIME。其他列值可以设置为零。它应该看起来像这样:
ID TIME ADMIN OBS OCC
1 0 10 0 1
1 1 0 1000 1
1 8 0 560 1
1 12 0 203 1
1 24 0 0 1
1 24 10 56 2
1 32 0 674 2
1 36 0 457 2
2 0 20 0 1
2 12 0 144 1
2 24 0 0 1
2 24 20 32 2
2 36 0 97 2
2 48 0 0 2
2 48 20 199 3
2 60 0 120 3
dplyr
解决方案将受到高度赞赏。我尝试过按 ID 分组、按场合过滤并使用 slice(n)
或 slice(1)
分别获取最后一行和第一行,但我现在有点卡住了。
library(dplyr)
bind_rows(df,
filter(df, OCC-lag(OCC, default=1)==1, .by=ID) |>
mutate(ADMIN=0, OBS=0)) |>
arrange(ID, TIME, ADMIN)
___
# A tibble: 16 × 5
ID TIME ADMIN OBS OCC
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 0 10 0 1
2 1 1 0 1000 1
3 1 8 0 560 1
4 1 12 0 203 1
5 1 24 0 0 2
6 1 24 10 56 2
7 1 32 0 674 2
8 1 36 0 457 2
9 2 0 20 0 1
10 2 12 0 144 1
11 2 24 0 0 2
12 2 24 20 32 2
13 2 36 0 97 2
14 2 48 0 0 3
15 2 48 20 199 3
16 2 60 0 120 3