按 ID 减去一列中的日期

Substract dates in one column by ID

我是 R 和这个网站的新手。我试图在此站点上搜索以找到解决我的问题的方法,但找不到。我的问题如下:

如何计算 ID 为“1”的日期与 ID 为“0”的前一个日期之间的差异。那么 ID 为“2”的日期与 ID 为“0”的前一个日期之间的差异,等等?我想将此差异作为新列 'Difference' 添加到我的数据表中。

此外,当计算“1”或“2”ID 之间的差异时,我希望有一个名为 'Performed_Date' 的列显示与 ID(1,2 等)对应的日期和“0”ID。

此外,当 ID(例如 ID“2”和 ID“3”)之间没有“0”ID 时,它应该计算最高 ID(本例中为“3”)与ID 为“0”的前一个日期。

我的数据表如下:

Registration  Date       ID   CBI   TBI
A118          7-3-2017   0    NA    NA
A118          8-3-2017   0    NA    NA
A118          9-3-2017   1    5     10
A118          10-3-2017  0    NA    NA
A118          11-3-2017  2    8     16
A118          12-3-2017  3    9     18
A118          13-3-2017  0    NA    NA
A118          14-3-2017  4    5     10

我的预期输出如下:

Registration  Date       ID   CBI   TBI  Difference  Performed_Date
A118          7-3-2017   0    NA    NA   1           9-3-2017          
A118          8-3-2017   0    NA    NA   1           11-3-2017
A118          9-3-2017   1    5     10   2           12-3-2017
A118          10-3-2017  0    NA    NA   1           14-3-2017
A118          11-3-2017  2    8     16   
A118          12-3-2017  3    9     18
A118          13-3-2017  0    NA    NA
A118          14-3-2017  4    5     10

我认为它应该是带有 ave 函数的 for 循环的东西,但我想不出可以计算它的东西。有人可以告诉我如何计算这个吗?

给你,

数据:

df<-
data.table::fread("
Registration  Date       ID   CBI   TBI
A118          7-3-2017   0    NA    NA
A118          8-3-2017   0    NA    NA
A118          9-3-2017   1    5     10
A118          10-3-2017  0    NA    NA
A118          11-3-2017  2    8     16
A118          12-3-2017  3    9     18
A118          13-3-2017  0    NA    NA
A118          14-3-2017  4    5     10")

代码:

df$Date <- as.Date(df$Date,format="%d-%m-%Y")

nonZeroIDs <- which(df$ID != 0)
relatedIDs <- sapply(nonZeroIDs,function(x){
                  for(i in x:1) if(df$ID[i] == 0) return(i)
                  })

diffs <- df$Date[nonZeroIDs] - df$Date[relatedIDs]

result<- data.frame(Difference=diffs,Performed_Date=df$Date[nonZeroIDs])

结果:

  Difference Performed_Date
1     1 days     2017-03-09
2     1 days     2017-03-11
3     2 days     2017-03-12
4     1 days     2017-03-14