#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. Спасибо, Понтус