2017-08-31 99 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進行字符串轉換。