R — Создание новых индексов на основе group_id и условного оператора

#r #dplyr #data.table

#r #dplyr #data.table

Вопрос:

Я работаю с фреймом данных (давайте вызовем MyData), который выглядит как показано ниже. Что я хочу сделать, так это сгруппировать по PatientKey и создать новый идентификатор с именем NewID. Каждый раз, когда для одного и того же PatientKey значение TimeBetweenTests равно> 14, новый идентификатор должен увеличиваться на 1 и оставаться на этом конкретном новом значении до тех пор, пока не появится новый PatientKey ИЛИ для того же patientKey не появится новый TimeBetweenTests> 14.

 PatientKey             TimeBetweenTests     NewId        
1                      0                    NewId should be 1 (first patient)
1                      0                    NewId should be 1
1                      1                    NewId should be 1                                                                
1                      2                    NewId should be 1
2                      3                    NewId should be 2 (new patient)                                                                          
3                      4                    NewId should be 3 (new patient)      
3                      16                   NewId should be 4 (same patient but TimeBetweenTests > 14)                                                                                              
3                      80                   NewId should be 5 (same patient but TimeBetweenTests > 14)
4                      3                    NewId should be 6 (new patient)
4                      0                    NewId should be 6 (new patient)                                                                            
4                      90                   NewId should be 7 (same patient but TimeBetweenTests > 14)        
4                      110                  NewId should be 8 (same patient but TimeBetweenTests > 14) 
5                      3                    NewId should be 9 (new patient)
5                      3                    NewId should be 9
5                      3                    NewId should be 9

etc    
                                                                       
  

Я пытался использовать для этого dplyr, но проблема в том, что последующие значения не меняются, когда я пытаюсь выполнить код, аналогичный:

MyData <- MyData %>% group_by(PatientKey) %>% mutate(NewId = ifelse(временные интервалы> 14, задержка (новый идентификатор), новый идентификатор))

У любого есть удобное решение dplyr или data.table для этого, в качестве альтернативы, для цикла.

Ответ №1:

Попробуйте это

 library(dplyr)
df %>% mutate(NewID = cumsum(lag(PatientKey, default = 0) != PatientKey | TimeBetweenTests > 14)
  

Вывод

    PatientKey TimeBetweenTests NewID
        <dbl>            <dbl> <int>
 1          1                0     1
 2          1                0     1
 3          1                1     1
 4          1                2     1
 5          2                3     2
 6          3                4     3
 7          3               16     4
 8          3               80     5
 9          4                3     6
10          4                0     6
11          4               90     7
12          4              110     8
13          5                3     9
14          5                3     9
15          5                3     9
  

Комментарии:

1. Я пробовал это, но проблема в том, что он изменяется только с первого раза, когда появляется значение, превышающее 14. Он также должен изменять идентификатор при появлении нового patientKey.

2. @PontusHedberg Привет, проверьте обновление. Это то, что вам нужно?

3. Привет, спасибо за ваши усилия, однако все еще остается проблемой и не приводит к правильной кумулятивной индексации на основе нового пациента и / или значения> 14. Лучший понтус

4. @PontusHedberg Возможно, я неправильно понял вашу точку зрения. Вам нужно, чтобы совокупный индекс увеличивался на 1 всякий раз, когда происходит изменение PatientKey или TimeBetweenTests > 14 , верно? Тогда, что, если все два условия выполняются одновременно (например, в строке 13 ввода, который я показал выше)? В этом случае вы хотите, чтобы совокупный индекс увеличился на 1 или 2 ?

5. Привет! Да, вы все правильно понимаете! Если это произойдет, оно должно увеличиться на 1, а не на 2. Спасибо, Понтус