创建包含上一行和下一行的值的行

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

我有一个纵向数据框,由多个 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)
分别获取最后一行和第一行,但我现在有点卡住了。

r dataframe dplyr
1个回答
0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.