2017-08-31 94 views
2

我想知道如何获取date differencetwo columndata.table使用lapply的data.table?R:获取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. 

我厌倦了以下内容:

dt[,lapply(.SD, diff.Date), .SDcols = c(4,2), ID] # but did not work! 
+1

dt [,“diff”:= difftime(strptime(dt $ Date,format =“%Y-%m-%d”),strptime(dt $ DOB,format =“%Y-%m-% d“),units =”weeks“)]' – Masoud

+1

@Masoud看起来像值得张贴的答案,但我想我会覆盖每个col作为IDate:= first。 – Frank

回答

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建议,最好转换(“覆盖”)的日期列POSIXct类第一。

+0

@SymbolixAU感谢编辑,但它只是涉及到喜好的问题,或者它听起来有点怪异。首先和首先是副词,并且是正确的:https://english.stackexchange.com/questions/174847/first-second-third-and-finally – Masoud

+0

*首先*(:p)我不打算踢如果你编辑回来,大惊小怪。 *其次*,该链接中的所有讨论都将其用作段落标题/开口,我同意这一点。但是,在我听来,在句子结尾处使用它听起来是错误的。 – SymbolixAU

+0

@SymbolizAU tbh对我来说听起来也不对。我会按原样离开它。干杯。 – Masoud

0

我的直觉(我将让别人指正)是,以下是对大数据集更快:

dt[,Date:=as.Date(Date)] 
dt[,DOB:=as.Date(DOB)] 
dt[,datediff:=as.integer(Date)-as.integer(DOB)] 

datediff将包含天日期的差异。

如果你有一个真正的大data.table,你可以考虑从fasttimefastPOSIXct进行字符串转换。