плохо знаком с SO (и r), поэтому, пожалуйста, дайте мне знать, если я что-то пропущу.
В продольном наборе данных я пытаюсь найти увеличение переменной (x
), которая соответствует определенномукритерии между всеми комбинациями наблюдения (day
) внутри групп (id
).
Увеличение (x
) критериев: где x
= 0 и увеличение> = 1,5;где x
составляет от 1 до 5,5 включительно и увеличивается> = 1;где x
превышает 5,5 и увеличивается> = 0,5.
id = c(1,1,1,1,
2,2,2,2,2,
3,3,
4,4,4,4,
5,5,5,5,
6,6,6,6,
7,7,7,7,7,
8,8,8,8,
9,9,9,9,9) %>% as.character()
day = c(0, 186, 384, 540,
0, 180, 360, 540, 720,
0, 200,
0, 190, 392, 601,
0, 152, 348, 581,
0, 187, 376, 581,
0, 151, 363, 527, 780,
0, 194, 371, 582,
0, 172, 387, 561, 701)
x = c(2.0, 2.0, 2.5, 2.5,
3.0, 3.5, 4.0, 4.5, 5.0,
0.0, 0.0,
1.5, 1.5, 2.5, 2.5,
1.0, 1.0, 1.5, 1.0,
0.0, 1.5, 1.5, 1.5,
5.5, 5.5, 6.0, 5.5, 5.5,
0.0, 0.0, 0.0, 1.5,
1.0, 1.0, 2.5, 2.0, 2.0)
df = data.frame(id, day, x)
Я могу использовать лаг / отрыв, чтобы найти различия между последующими или близкими наблюдениями (как показано ниже), однако у меня может быть много наблюдений на id
так что это невозможно. Разница в day
также будет полезна. Это может быть достигнуто с помощью решения с итеративным циклом, но есть ли векторизованный способ dplyr?
df %>%
group_by(id) %>%
select(id, x, day) %>%
mutate(x.progress = ifelse(lag(x) == 0.0 & x - lag(x) >= 1.5, "1",
ifelse((lag(x) >= 1.0 & lag(x) <= 5.5) & x - lag(x) >= 1.0, "1",
ifelse(lag(x) > 5.5 & x - lag(x) >= 0.5, "1",
ifelse(x < lag(x), "0", "0"))))) %>%
mutate(x.progress.1 = ifelse(lag(x) == 0.0 & lead(x) - lag(x) >= 1.5, "1",
ifelse(lag(x) >= 1.0 & lag(x) <= 5.5 & lead(x) - lag(x) >= 1.0, "1",
ifelse(lag(x) > 5.5 & lead(x) - lag(x) >= 0.5, "1", "0")))) %>%
mutate(x.progress.1.time = lead(day) - day) %>%
mutate(x.progress.2 = ifelse(lag(x) == 0.0 & lead(x, 2) - lag(x) >= 1.5, "1",
ifelse(lag(x) >= 1.0 & lag(x) <= 5.5 & lead(x, 2) - lag(x) >= 1.0, "1",
ifelse(lag(x) > 5.5 & lead(x, 2) - lag(x) < 0.5, "1", "0")))) %>%
mutate(x.progress.2.time = lead(day, 2) - day)
Результаты в следующем выводе (извинения за форматирование).
# A tibble: 37 x 8
id x day x.progress x.progress.1 x.progress.1.time x.progress.2 x.progress.2.time
<fct> <dbl> <dbl> <chr> <chr> <dbl> <chr> <dbl>
1 1 2 0 NA NA 186 NA 384
2 1 2 186 0 0 198 0 354
3 1 2.5 384 0 0 156 NA NA
4 1 2.5 540 0 NA NA NA NA
5 2 3 0 NA NA 180 NA 360
6 2 3.5 180 0 1 180 1 360
7 2 4 360 0 1 180 1 360
8 2 4.5 540 0 1 180 NA NA
9 2 5 720 0 NA NA NA NA
10 3 0 0 NA NA 200 NA NA
11 3 0 200 0 NA NA NA NA
12 4 1.5 0 NA NA 190 NA 392
13 4 1.5 190 0 1 202 1 411
14 4 2.5 392 1 1 209 NA NA
15 4 2.5 601 0 NA NA NA NA
16 5 1 0 NA NA 152 NA 348
17 5 1 152 0 0 196 0 429
18 5 1.5 348 0 0 233 NA NA
19 5 1 581 0 NA NA NA NA
20 6 0 0 NA NA 187 NA 376
21 6 1.5 187 1 1 189 1 394
22 6 1.5 376 0 0 205 NA NA
23 6 1.5 581 0 NA NA NA NA
24 7 5.5 0 NA NA 151 NA 363
25 7 5.5 151 0 0 212 0 376
26 7 6 363 0 0 164 0 417
27 7 5.5 527 0 0 253 NA NA
28 7 5.5 780 0 NA NA NA NA
29 8 0 0 NA NA 194 NA 371
30 8 0 194 0 0 177 1 388
31 8 0 371 0 1 211 NA NA
32 8 1.5 582 1 NA NA NA NA
33 9 1 0 NA NA 172 NA 387
34 9 1 172 0 1 215 1 389
35 9 2.5 387 1 1 174 1 314
36 9 2 561 0 0 140 NA NA
37 9 2 701 0 NA NA NA NA
Тогда я могу использоватьfilter
, чтобы найти случаи, когда увеличение соответствует критериям для каждого отставания / опережения.
filter(x.progress == 1 & x.progress.1 == 1 & x.progress.2 == 1)
<fct> <dbl> <dbl> <chr> <chr> <dbl> <chr> <dbl>
1 6 1.5 187 1 1 189 1 394
2 9 2.5 387 1 1 174 1 314
. При этом I ограничивается значением k, передаваемым в функцию отставания, где увеличение может происходить между n-м и n-м+10 наблюдение (например). Выходными данными может быть матрица разности между каждой итеративной парой наблюдений (x), которая затем может быть запрошена для увеличения, соответствующего критериям. (в данном случае это показатель инвалидности, и я ищу прогрессирование инвалидности, подтвержденное на определенный период времени)
Любой вклад приветствуется!