Найти число наблюдений, поскольку противоположное событие произошло в R, используя таблицы данных - PullRequest
1 голос
/ 01 апреля 2020

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

Набор данных, который у меня есть, выглядит следующим образом:

  date     event  id obs_since_event_1 obs_since_event_2
2000-07-06     2  1        NA                 NA
2000-07-07     1  1        NA                 1
2000-07-09     0  1        1                  2
2000-07-10     0  1        2                  3
2000-07-15     2  1        3                  4
2000-07-16     1  1        4                  1
2000-07-20     0  1        1                  2
2000-07-21     1  1        2                  3
2000-07-06     1  2        NA                 NA
2000-07-07     2  2        1                  NA
2000-07-15     0  2        2                  1
2000-07-16     0  2        3                  2
2000-07-17     2  2        4                  3
2000-07-18     1  2        5                  1

И я надеюсь добавить столбец с именем days_since_opposite. который записывает количество дней с момента возникновения противоположного события (противоположные события 1 и 2). У меня уже есть количество дней с тех пор, как произошло событие 1 или 2. Теперь мне нужно разработать оператор if, который работает в таблицах данных, который предоставит мне соответствующие значения в последнем столбце.

  date     event  id obs_since_event_1 obs_since_event_2 days_since_opposite
2000-07-06     2  1        NA                 NA                  NA
2000-07-07     1  1        NA                 1                   NA
2000-07-09     0  1        1                  2                   NA
2000-07-10     0  1        2                  3                   NA
2000-07-15     2  1        3                  4                   3
2000-07-16     1  1        4                  1                   1
2000-07-20     0  1        1                  2                   NA
2000-07-21     1  1        2                  3                   3

Надеюсь, это понятно. У меня также есть разные идентификаторы, но я не уверен, влияет ли это на результаты.

Я пробовал что-то вроде следующего, но это не сработало:

data[,days_since_opposite:=ifelse(event==1,obs_since_event_2,ifelse(event==2,obs_since_event_1,0)),]

Заранее спасибо

ДАННЫЕ

Input = (
  '  date     event  id obs_since_event_1 obs_since_event_2
2000-07-06     2  1        NA                 NA
2000-07-07     1  1        NA                 1
2000-07-09     0  1        1                  2
2000-07-10     0  1        2                  3
2000-07-15     2  1        3                  4
2000-07-16     1  1        4                  1
2000-07-20     0  1        1                  2
2000-07-21     1  1        2                  3
2000-07-06     1  2        NA                 NA
2000-07-07     2  2        1                  NA
2000-07-15     0  2        2                  1
2000-07-16     0  2        3                  2
2000-07-17     2  2        4                  3
2000-07-18     1  2        5                  1')
df = read.table(textConnection(Input), header = T)

1 Ответ

1 голос
/ 02 апреля 2020

Вот вариант:

#identify the opposite event
DT[, oppev := c(0L, 2L, 1L)[event + 1L]]

#for event 1 and 2, perform non-equi join to find the prev opp event
DT[event %in% c(1L, 2L), days_since_opposite := DT[.SD, 
    on=.(id, event=oppev, date<date), mult="last", as.integer(i.date - x.date)]]

вывод:

          date event id oppev days_since_opposite
 1: 2000-07-06     2  1     1                  NA
 2: 2000-07-07     1  1     2                   1
 3: 2000-07-09     0  1     0                  NA
 4: 2000-07-10     0  1     0                  NA
 5: 2000-07-15     2  1     1                   8
 6: 2000-07-16     1  1     2                   1
 7: 2000-07-20     0  1     0                  NA
 8: 2000-07-21     1  1     2                   6
 9: 2000-07-06     1  2     2                  NA
10: 2000-07-07     2  2     1                   1
11: 2000-07-15     0  2     0                  NA
12: 2000-07-16     0  2     0                  NA
13: 2000-07-17     2  2     1                  11
14: 2000-07-18     1  2     2                   1

данные:

library(data.table)
DT <- fread("date     event  id 
2000-07-06     2  1        
2000-07-07     1  1        
2000-07-09     0  1        
2000-07-10     0  1        
2000-07-15     2  1        
2000-07-16     1  1        
2000-07-20     0  1        
2000-07-21     1  1        
2000-07-06     1  2        
2000-07-07     2  2        
2000-07-15     0  2        
2000-07-16     0  2        
2000-07-17     2  2        
2000-07-18     1  2")[, date := as.IDate(date, format="%Y-%m-%d")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...