Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/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 获取Data.table中的日期差_R_Date_Data.table_Lapply - Fatal编程技术网

R 获取Data.table中的日期差

R 获取Data.table中的日期差,r,date,data.table,lapply,R,Date,Data.table,Lapply,我想知道如何使用data.table中的lappy获取data.table中两列的日期差 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 20

我想知道如何使用data.table中的
lappy
获取
data.table中
两列
日期差

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. 

您可以使用
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
但是,正如建议的那样,最好先将日期列转换(“覆盖”)为
POSIXct
类。

我的直觉(我会让其他人纠正我)是,在大型数据集上,以下速度更快:

dt[,Date:=as.Date(Date)]
dt[,DOB:=as.Date(DOB)]
dt[,datediff:=as.integer(Date)-as.integer(DOB)]
datediff
将包含以天为单位的日期差异


如果您有一个真正的大数据表,您可以考虑从<代码> FASTIMECT/<代码>中进行字符串转换。

<代码> Dt[,“DIFF”:= DeffTimes(StrpTime:DT $日期,格式=%y-%m%d)),STRPTIME(DT $DOB,格式=“%Y-%-M %D”),单位=“代码”> @ MasHOW看起来像一个值得张贴的东西,虽然我想我会用:=first覆盖每个列作为IDate。@谢谢你的编辑,但这只是关于偏好的问题,或者它听起来是否有点奇怪。first和first都是副词,而且都是正确的:首先,如果你把它编辑回来,我不会大惊小怪的。其次,该链接中的所有讨论都谈到将其用作段落标题/开头,我同意这一点。然而,在我听来,它在句末使用时听起来是错误的。@symbolzau tbh它在我听来也不正确。我要让它保持原样。干杯
dt[,Date:=as.Date(Date)]
dt[,DOB:=as.Date(DOB)]
dt[,datediff:=as.integer(Date)-as.integer(DOB)]