【问题标题】:R conditional calculate date differenceR条件计算日期差异
【发布时间】:2021-12-31 20:30:12
【问题描述】:

我需要找到一种快速的方法来有条件地找出数据表中两个日期之间的差异(以天为单位)。我设法用“ifelse”语句来做到这一点,但在大对象上速度很慢,所以我的问题是,是否有更快、更优雅的方式来实现同样的效果,也许使用 data.table 命令,如“:=”或其他东西。谢谢。 J.

library(lubridate)
library(data.table)

rm(list = ls())

a <- as.Date(c ("2021-09-27", "2019-10-30", "2021-09-05"))
b <- as.Date(c ("2020-06-14", "2019-09-15", "2020-09-23"))
c <- as.Date(c ("2022-07-12", "2020-09-23", "2021-06-19"))

new <- data.table(leave = a, start = b, end = c)

new$days <- ifelse (
    new$leave < new$end,
    new$leave - new$start,
    new$end - new$start)

也就是说,当离开日期 =结束,然后从结束减去开始,并以天为单位在新列中返回结果。

【问题讨论】:

  • 试试data.table::fiflese()。获取一些信息here
  • 这样做会更快吗? new[, days := pmin(leave, end) - start]

标签: r data.table lubridate


【解决方案1】:

使用pmin()函数和data.table的赋值运算符:=

new[, days := as.numeric(pmin(leave, end)-start)]

或者您可以以一种方式将其分配给所有行,然后链接一个子集:

new[, days := as.numeric(end - start)][leave < end, days := leave - start]

或利用by.GRP 特殊字符:

new[, days := list(leave-start, end-start)[.GRP], keyby=.(leave>=end)]

【讨论】:

  • 嗨@JimMaas - 我在这里添加了第三个选项。如果这些都不能满足需求,请告诉我,我会想办法的:)
猜你喜欢
  • 2019-08-24
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多