在数据框中存储润滑间隔

Storing lubridate intervals in a dataframe

我正在尝试在数据框中存储一些间隔。执行此操作的代码的简化版本如下:

DateHired <- c("29/09/14", "07/04/08", "18/06/09", "09/03/15", "30/05/11", "05/11/07", "08/09/08", "30/09/13", "10/08/09", "13/08/14", "18/09/06", "21/01/08", "05/12/11", "28/06/10", "19/07/10", "05/05/14", "26/08/09", "21/04/08", "19/10/09")
TerminationDate <- c("11/06/10", "10/02/10", "06/10/09", "02/04/15", "30/06/11", "10/11/07", "17/04/14", "04/10/13", "08/02/12", "11/06/10", "03/07/09", "11/06/10", "08/08/13", "23/12/10", "20/12/13", "11/06/10", "11/06/10", "05/12/08", "01/03/10")
tenures =  data.frame(DateHired, TerminationDate, stringsAsFactors=FALSE)

tenures$isoStart  <- as.Date(tenures$DateHired, format="%d/%m/%Y")
tenures$isoFinish <- as.Date(tenures$TerminationDate, format="%d/%m/%Y")

tenures$periods =  apply(tenures, 1, function(x) interval(x['isoStart'], x['isoFinish']) )

结果如下:

> tenures$periods
[1] -135734400   58233600    9504000    2073600    2678400     432000  176860800     345600   78796800 -131673600   88041600   75340800
[13]   52876800   15379200  108000000 -123033600   24969600   19699200   11491200

当我手动执行相同操作时。即

> interval(as.Date("29/09/14", format="%d/%m/%Y"),as.Date("29/09/15", format="%d/%m/%Y") )
[1] 14-09-29 10:04:52 LMT--15-09-29 10:04:52 LMT

它给出了润滑间隔。

我可以通过其他方式解决这个问题,但我希望在拼图的下一部分中使用间隔!

tenures$isoStart  <- as.Date(tenures$DateHired, format="%d/%m/%y")
tenures$isoFinish <- as.Date(tenures$TerminationDate, format="%d/%m/%y")

tenures$periods =  interval(tenures$isoStart, tenures$isoFinish)

您的日期格式 "%d/%m/%Y" 没有反映您数据中的两位数年份。大写 %Y 代表四位数年份。

此外,interval 函数是向量化的,这意味着它将获取每个向量的第一个元素并创建一个区间,然后移动到每个向量的第二个元素,并继续到最后。

head(tenures$periods)
#[1] 2014-09-28 20:00:00 EDT--2010-06-10 20:00:00 EDT 2008-04-06 20:00:00 EDT--2010-02-09 19:00:00 EST
#[3] 2009-06-17 20:00:00 EDT--2009-10-05 20:00:00 EDT 2015-03-08 20:00:00 EDT--2015-04-01 20:00:00 EDT
#[5] 2011-05-29 20:00:00 EDT--2011-06-29 20:00:00 EDT 2007-11-04 19:00:00 EST--2007-11-09 19:00:00 EST

为什么您的第一个功能不起作用?好吧,它在某种意义上确实起作用了。输出是两个日期之间的跨度,但 format/class 是意外的。给出了两个日期之间的秒数,而不是间隔输出。

有关强制和 ?apply 的更多信息:

If X is not an array but an object of a class with a non-null dim value (such as a data frame), apply attempts to coerce it to an array via as.matrix if it is two-dimensional (e.g., a data frame) or via as.array.

该函数将在 data.frames 上运行,但会发出警告,提示转换为矩阵后结果可能与您预期的不同。 lapply 对数据框更友好,在这种情况下,函数已经矢量化。