根据条件增量创建新索引

Create new index based on conditional increment

我有一个看起来像这样的数据框(但有 1000 行):

Person_ID Visit_ID Time_Diff
1 1 NA
2 2 NA
3 3 NA
3 4 1444
4 5 NA
4 6 0
4 7 0
4 8 180
5 9 NA
6 10 NA
7 11 NA
7 12 19
8 13 NA
8 14 25
9 15 NA

从这里你看到的是:

  1. 同一个person_ID可以在多行
  2. Visit_ID总是加1
  3. 时差有时为 NA,有时为负,有时为正

我想做的是:

  1. 创建一个新的Visit_ID(我们称它为New_Visit_ID)
  2. 从第一行的 1 开始该 ID,然后为每一行增加 Person_ID 更改或 Time_Diff >24(即不是 NA 或 <=24)

这意味着时间差 <=24 的相同 Person_ID 应该具有相同的 New_Visit_ID,即某种条件增量。

希望这是清楚的!

所需的输出应该是:

Person_ID Visit_ID Time_Diff New_Visit_ID
1 1 NA 1
2 2 NA 2
3 3 NA 3
3 4 1444 4
4 5 NA 5
4 6 0 5
4 7 0 5
4 8 180 6
5 9 NA 7
6 10 NA 8
7 11 NA 9
7 12 19 9
8 13 NA 10
8 14 25 11
9 15 NA 12

我们根据两个条件创建'ind1'、'ind2'两列 1)检查'Time_Diff'是否大于24。2)检查'Person_ID'的相邻元素是否相同,然后将它们加在一起,得到累加和 (cumsum) 以创建 'New_Visit_ID'

library(dplyr)
df1 %>%
   mutate(ind1 = (Time_Diff > 24 & !is.na(Time_Diff)),
   ind2 = Person_ID != lag(Person_ID, default = first(Person_ID)),
   New_Visit_ID= cumsum(ind1 + ind2) + 1, ind1 = NULL, ind2 = NULL)

-输出

#    Person_ID Visit_ID Time_Diff New_Visit_ID
#1          1        1        NA            1
#2          2        2        NA            2
#3          3        3        NA            3
#4          3        4      1444            4
#5          4        5        NA            5
#6          4        6         0            5
#7          4        7         0            5
#8          4        8       180            6
#9          5        9        NA            7
#10         6       10        NA            8
#11         7       11        NA            9
#12         7       12        19            9
#13         8       13        NA           10
#14         8       14        25           11
#15         9       15        NA           12

数据

df1 <- structure(list(Person_ID = c(1L, 2L, 3L, 3L, 4L, 4L, 4L, 4L, 
5L, 6L, 7L, 7L, 8L, 8L, 9L), Visit_ID = 1:15, Time_Diff = c(NA, 
NA, NA, 1444L, NA, 0L, 0L, 180L, NA, NA, NA, 19L, NA, 25L, NA
)), class = "data.frame", row.names = c(NA, -15L))