按 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
我是 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