R - функция для расчета разницы между всеми комбинациями наблюдений в группах - PullRequest
0 голосов
/ 11 ноября 2019

плохо знаком с 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), которая затем может быть запрошена для увеличения, соответствующего критериям. (в данном случае это показатель инвалидности, и я ищу прогрессирование инвалидности, подтвержденное на определенный период времени)

Любой вклад приветствуется!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...