我想知道如何使用data.table中的date difference
获取two column
data.table
lapply
的内容?
library(data.table)
dt <- fread(" ID Date ME_Mes DOB
A 2017-02-20 0.0000 2016-08-19
B 2017-02-06 2.3030 2016-03-11
C 2017-03-20 0.4135 2016-08-19
D 2017-03-06 0.0480 2016-10-09
E 2017-04-20 2.4445 2016-05-04")
> dt
ID Date ME_Mes DOB
1: A 2017-02-20 0.0000 2016-08-19
2: B 2017-02-06 2.3030 2016-03-11
3: C 2017-03-20 0.4135 2016-08-19
4: D 2017-03-06 0.0480 2016-10-09
5: E 2017-04-20 2.4445 2016-05-04
###I'd like to calculate the difference in weeks for every ID by comparing the DOB-Date.
我厌倦了以下事情:
dt[,lapply(.SD, diff.Date), .SDcols = c(4,2), ID] # but did not work!
答案 0 :(得分:4)
您可以使用difftime
来获得数周的差异。但是,您需要将列转换为POSIXct
。
如果您希望保持列的类不变,则可以使用:
dt[, "DOB_Date" := difftime(strptime(dt$Date, format = "%Y-%m-%d"),
strptime(dt$DOB, format = "%Y-%m-%d"), units = "weeks")]
dt
## ID Date ME_Mes DOB DOB_Date
## 1: A 2017-02-20 0.0000 2016-08-19 26.43452 weeks
## 2: B 2017-02-06 2.3030 2016-03-11 47.42857 weeks
## 3: C 2017-03-20 0.4135 2016-08-19 30.42857 weeks
## 4: D 2017-03-06 0.0480 2016-10-09 21.14881 weeks
## 5: E 2017-04-20 2.4445 2016-05-04 50.14286 weeks
但是,正如@Frank建议您最好将日期列转换为{&#34;覆盖&#34;}为POSIXct
类。
答案 1 :(得分:2)
我的预感(我会让别人纠正我)是大型数据集上的以下内容更快:
dt[,Date:=as.Date(Date)]
dt[,DOB:=as.Date(DOB)]
dt[,datediff:=as.integer(Date)-as.integer(DOB)]
datediff
将包含日期差异。
如果你有一个真正大的data.table,你可以考虑从fastPOSIXct
fasttime
进行字符串转换。