计算自上次事件以来经过的时间(具有多种事件类型和 ID)

问题描述 投票:0回答:2

之前已经提出过类似的问题,其中的问题是如何计算自事件以来的观察数量。我还有一个请求。如何计算自同一类型的观察以来的天数,以及查找自任何其他类型的事件以来的天数。我也有id。

请参阅下文进行说明。我正在尝试使用数据表在 R 中执行此操作,但收效甚微。

我有:

  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

这两个事件是互斥的,即它们不能在同一天发生。

r loops
2个回答
2
投票

以下使用

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
投票

您可以使用特定事件编码对所有日期进行子集化,例如:

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

然后就做

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

等等。 也许这更容易做到,但这是我首先想到的事情。 DATAFRAME 只是您的数据框的名称。

编辑:如果我没看错的话,您想要在 ID 和事件列彼此不同的地方使用 NA 吗?然后你可以继续: DATAFRAME[which(DATAFRAME[,2] != DATAFRAME[,3]),c(4,5)] = NA 或类似的东西

© www.soinside.com 2019 - 2024. All rights reserved.