根据条件增量创建新索引
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
从这里你看到的是:
- 同一个person_ID可以在多行
- Visit_ID总是加1
- 时差有时为 NA,有时为负,有时为正
我想做的是:
- 创建一个新的Visit_ID(我们称它为New_Visit_ID)
- 从第一行的 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))
我有一个看起来像这样的数据框(但有 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 |
从这里你看到的是:
- 同一个person_ID可以在多行
- Visit_ID总是加1
- 时差有时为 NA,有时为负,有时为正
我想做的是:
- 创建一个新的Visit_ID(我们称它为New_Visit_ID)
- 从第一行的 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))