Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-使用多个事件类型和ID计算自上次事件以来经过的时间_R_Loops_Datatables - Fatal编程技术网

R-使用多个事件类型和ID计算自上次事件以来经过的时间

R-使用多个事件类型和ID计算自上次事件以来经过的时间,r,loops,datatables,R,Loops,Datatables,以前也曾问过类似的问题,问题是如何计算事件发生后的观察次数。我还有一个要求。如何计算自同一类型观察以来的天数,以及自任何其他类型事件以来的天数。我也有身份证 如需说明,请参见下文。我试图用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 200

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

如需说明,请参见下文。我试图用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
这两个事件是相互排斥的,也就是说,它们不能在同一天发生。
希望听到一些好的建议。祝你一切顺利

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

date.2 = DATAFRAME[which(DATAFRAME[,2]==2),1]
然后就这么做

DATAFRAME[which(DATAFRAME[,2]==2),5] = as.numeric(diff.Date(date.2))
等等。 也许这更容易做到,但这是我想到的第一件事。 DATAFRAME只是这里的DATAFRAME的名称

编辑:如果我没看错的话,您希望在ID和事件列彼此不同的地方使用NAs吗?然后你可以继续:
DATAFRAME[which(DATAFRAME[,2]!=DATAFRAME[,3]),c(4,5)]=NA或类似的东西下面使用
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}
  }
}

要处理您的评论,您可以在
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}
  }
}

您好,是的,NAs将发生,因为该ID没有之前的事件。我意识到我输入的问题错误,我不需要观察之间的天数,而是每个事件之间的观察次数。谢谢您的回答。我现在发现,我实际上对每个事件之间的天数不感兴趣,而是对观察次数感兴趣。你有办法吗?或者,这可能只是要在stack exchange上发布的另一个问题。我已经编辑了我的回答,为您的新问题添加了一个“修复”。如果您的需求符合要求,请考虑将标记标记为“回答”。
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