Как я могу проверить, является ли значение в одной строке уникальным по сравнению со всеми предыдущими строками по группам, и подсчитать количество различных значений - PullRequest
0 голосов
/ 18 января 2019

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

Например, для ID=1 я хочу сравнить препарат текущей строки со всеми предыдущими строками (или с сегодняшним днем, сравнить с теми, DATE ранее текущей строки) в ID=1, например. В строке 2 препарат A такой же, как в строке 1, поэтому EXIST_BEFORE кодируется как 1; для строки 4 C уникально по сравнению с предыдущими строками (A, B, C), поэтому кодируется как 0.

добавить еще один вопрос: как подсчитать количество различных drug до текущего date? например, для ID=1, prev_drug для строки 4 равно 2, поскольку в нем два препарата (A, B) отличаются от препарата C до DATE строки 4.

ID  DATE       DRUG EXIST_BEFORE  prev_drug
1   2001-01-01  A   NA            0
1   2001-02-01  A   1             0
1   2001-03-15  B   0             1
1   2001-04-20  C   0             2
1   2001-05-29  A   1             2
1   2001-05-02  B   1             2
2   2001-03-02  A   NA            0
2   2001-03-23  C   0             1
2   2001-04-04  D   0             2
2   2001-05-05  B   0             3

Я знаю только, как сравнить с одной строкой выше на lag(), но понятия не имею о сравнении с предыдущей датой для каждого ID.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

В качестве альтернативы можно использовать функцию rowid() из пакета :

library(data.table)
setDT(DT)[order(DATE), EXIST_BEFORE := pmin(1L, rowid(ID, DRUG) - 1L)]
DT
    ID       DATE DRUG EXIST_BEFORE
 1:  1 2001-01-01    A            0
 2:  1 2001-02-01    A            1
 3:  1 2001-03-15    B            0
 4:  1 2001-04-20    C            0
 5:  1 2001-05-29    A            1
 6:  1 2001-05-02    B            1
 7:  2 2001-03-02    A            0
 8:  2 2001-03-23    C            0
 9:  2 2001-04-04    D            0
10:  2 2001-05-05    B            0

rowid(ID, DRUG) - 1L подсчитывает количество вхождений ID и DRUG (вид подразумеваемой группировки), начиная с 0. pmin() используется для обрезания значений больше 1. order(DATE) обеспечивает правильную сортировку строк .

Или, как предлагается в Комментарий Сотоса :

setDT(DT)[order(DATE), EXIST_BEFORE := as.integer(duplicated(DRUG)), by = ID][]
0 голосов
/ 18 января 2019

Для этого попробуйте использовать dplyr. По сути, мы можем просто группировать по ID и DRUG. Для этой сгруппированной комбинации найдите первое DATE вхождение, используя min(). Затем, если дата после этого первого вхождения, то это повторение.

library(dplyr)

mydata %>%
  group_by(ID, DRUG) %>%
  mutate(FIRST_OCCURANCE = min(DATE),
         EXIST_BEFORE = DATE > FIRST_OCCURANCE)

      ID DATE       DRUG  EXIST_BEFORE FIRST_OCCURANCE
   <int> <date>     <chr> <lgl>        <date>         
 1     1 2001-01-01 A     FALSE        2001-01-01     
 2     1 2001-02-01 A     TRUE         2001-01-01     
 3     1 2001-03-15 B     FALSE        2001-03-15     
 4     1 2001-04-20 C     FALSE        2001-04-20     
 5     1 2001-05-29 A     TRUE         2001-01-01     
 6     1 2001-05-02 B     TRUE         2001-03-15     
 7     2 2001-03-02 A     FALSE        2001-03-02     
 8     2 2001-03-23 C     FALSE        2001-03-23     
 9     2 2001-04-04 D     FALSE        2001-04-04     
10     2 2001-05-05 B     FALSE        2001-05-05

Я разбил его на две переменные, чтобы показать, что происходит, но вы также можете уменьшить строку mutate() просто до:

mutate(EXIST_BEFORE = DATE > min(DATE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...