【问题标题】:Get the Date Difference in Data.table获取 Data.table 中的日期差异
【发布时间】:2018-02-09 19:55:10
【问题描述】:

我想知道如何使用 data.table 中的lapply 获取data.table 中的two columndate difference

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!

【问题讨论】:

  • dt[, "diff" := difftime(strptime(dt$Date, format = "%Y-%m-%d"),strptime(dt$DOB, format = "%Y-%m-%d"), units = "weeks")]
  • @Masoud 看起来值得作为答案发布,但我想我会先用 := 覆盖每个列作为 IDate。

标签: r date data.table lapply


【解决方案1】:

您可以使用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 类。

【讨论】:

  • @SymbolixAU 感谢您的编辑,但这只是偏好问题,或者听起来是否有点奇怪。 first 和 firstly 都是副词并且是正确的:english.stackexchange.com/questions/174847/…
  • 首先 (:p) 如果你把它编辑回来,我不会大惊小怪的。 其次,该链接中的所有讨论都谈到将其用作段落标题/开头,我同意。但是,在我看来,在句末使用时听起来不对。
  • @SymbolizAU tbh 这听起来也不对我来说。我会保持原样。干杯。
【解决方案2】:

我的预感(我会让其他人纠正我)是以下在大型数据集上更快:

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

datediff 将包含以天为单位的日期差异。

如果你有一个非常大的data.table,你可以考虑fastPOSIXct from fasttime 进行字符串转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2023-01-15
    • 1970-01-01
    相关资源
    最近更新 更多