R - Рассчитать время, прошедшее с последних событий с несколькими типами событий и идентификаторами - PullRequest
2 голосов
/ 24 марта 2020

Подобные вопросы были заданы ранее, где вопрос заключается в том, как рассчитать количество наблюдений после события. У меня есть еще одна просьба. Как рассчитать количество дней с момента того же типа наблюдения, но также найти количество дней с любого другого типа события. У меня также есть идентификаторы.

Для иллюстрации см. Ниже. Я пытаюсь сделать это в R с использованием Datatables, но с небольшим результатом.

Что у меня есть:

  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     event  id days_since_event_1 days_since_event_2
2000-07-06     2  1        NA                 NA
2000-07-07     1  1        NA                 1
2000-07-09     0  1        2                  3
2000-07-10     0  1        3                  4
2000-07-15     2  1        8                  9
2000-07-16     1  1        9                  1
2000-07-20     0  1        4                  5
2000-07-21     1  1        5                  6
2000-07-06     1  2        NA                 NA
2000-07-07     2  2        1                  NA
2000-07-15     0  2        9                  8
2000-07-16     0  2        10                 9
2000-07-17     2  2        11                 10
2000-07-18     1  2        12                 1

Два события являются взаимоисключающими, то есть они не может состояться в тот же день. Надеюсь услышать несколько хороших советов. Всего наилучшего.

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Следующее использует библиотеку Chron для расчета разницы в датах

library(chron)

df$date <- chron(as.character(df$date),format=c(date="y-m-d"))

for(j in unique(df$id)){
  DaysSince1 <-NA
  DaysSince2 <-NA
  RowsWithID <- grep(j,df$id)

  for(i in RowsWithID){
    df$days_since_event_1[i] <- df$date[i]-df$date[i-DaysSince1]
    df$days_since_event_2[i] <- df$date[i]-df$date[i-DaysSince2]

    if(df$event[i]==1){DaysSince1<-1}
      else{DaysSince1<-DaysSince1+1}

    if(df$event[i]==2){DaysSince2<-1}
      else{DaysSince2<-DaysSince2+1}
  }
}

Этот код дает следующие результаты

> df
       date event id days_since_event_1 days_since_event_2
1  00-07-06     2  1                 NA                 NA
2  00-07-07     1  1                 NA                  1
3  00-07-09     0  1                  2                  3
4  00-07-10     0  1                  3                  4
5  00-07-15     2  1                  8                  9
6  00-07-16     1  1                  9                  1
7  00-07-20     0  1                  4                  5
8  00-07-21     1  1                  5                  6
9  00-07-06     1  2                 NA                 NA
10 00-07-07     2  2                  1                 NA
11 00-07-15     0  2                  9                  8
12 00-07-16     0  2                 10                  9
13 00-07-17     2  2                 11                 10
14 00-07-18     1  2                 12                  1

Чтобы ответить на ваш комментарий, вы можно сделать следующее в Base R, чтобы получить количество наблюдений, а не дней. Библиотеки не нужны.

for(j in unique(df$id)){
  ObsSince1 <-NA
  ObsSince2 <-NA
  RowsWithID <- grep(j,df$id)

  for(i in RowsWithID){
    df$Obs_since_event_1[i] <- ObsSince1
    df$Obs_since_event_2[i] <- ObsSince2

    if(df$event[i]==1){ObsSince1<-1}
    else{ObsSince1<-ObsSince1+1}

    if(df$event[i]==2){ObsSince2<-1}
    else{ObsSince2<-ObsSince2+1}
  }
}

Вы должны получить следующий вывод

> df
         date event id Obs_since_event_1 Obs_since_event_2
1  2000-07-06     2  1                NA                NA
2  2000-07-07     1  1                NA                 1
3  2000-07-09     0  1                 1                 2
4  2000-07-10     0  1                 2                 3
5  2000-07-15     2  1                 3                 4
6  2000-07-16     1  1                 4                 1
7  2000-07-20     0  1                 1                 2
8  2000-07-21     1  1                 2                 3
9  2000-07-06     1  2                NA                NA
10 2000-07-07     2  2                 1                NA
11 2000-07-15     0  2                 2                 1
12 2000-07-16     0  2                 3                 2
13 2000-07-17     2  2                 4                 3
14 2000-07-18     1  2                 5                 1
2 голосов
/ 24 марта 2020

Вы можете установить свои Даты для всех с определенной c кодировкой события, например:

date.2 = DATAFRAME[which(DATAFRAME[,2]==2),1]

, а затем просто сделать

DATAFRAME[which(DATAFRAME[,2]==2),5] = as.numeric(diff.Date(date.2))

и так далее. Возможно, это еще проще сделать, но это было первым, что пришло мне в голову. DATAFRAME - это просто название вашего фрейма данных.

edit: Если я правильно вижу, вы хотите, чтобы NA были там, где ID и столбец события отличаются друг от друга? Тогда вы можете просто go включить: DATAFRAME [which (DATAFRAME [, 2]! = DATAFRAME [, 3]), c (4,5)] = NA или что-то в этом роде

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