【问题标题】:R - Calculate Time Elapsed Since Last Events with Multiple Event Types and IDsR - 使用多种事件类型和 ID 计算自上次事件以来经过的时间
【发布时间】:2020-03-24 11:25:00
【问题描述】:

之前有人问过类似的问题,问题是如何计算事件发生后的观察次数。我还有一个要求。如何计算自同一类型观察以来的天数,以及查找自任何其他类型事件以来的天数。我也有身份证。

为了说明,请参见下文。我正在尝试使用 Datatables 在 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 datatables


    【解决方案1】:

    下面使用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 或类似的东西

    【讨论】:

    • 您好,是的,NA 会发生,因为该 ID 没有先前的事件。我意识到我输入了错误的问题,我不需要观察之间的天数,而是每个事件之间的观察次数。
    猜你喜欢
    • 2015-12-19
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 2015-08-04
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多