按标识

时间:2018-04-12 07:16:50

标签: r date for-loop datatable difference

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

如何计算出“' 1”的日期之间的差异? ID和上一个日期有' 0' ID。那么有一个' 2' ID和上一个日期有ID' 0'等等?我想将这种差异添加为一个新专栏'差异'到我的数据表。

此外,我想要一个名为' Performed_Date'当在' 1'之间计算差异时,显示与ID(1,2等等)相对应的日期。或者' 2' ID和' 0' ID。

此外,当没有' 0' ID之间的ID(ID' 2'以及ID' 3'例如)它应该计算最高ID之间的差异(' 3'在此例子)和上一个日期的' 0' ID。

我的数据表如下:

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循环,但我想不出可以计算它的东西。有人可以告诉我如何计算这个吗?

1 个答案:

答案 0 :(得分:1)

你去,

数据:

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