在数据框中存储润滑间隔
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
对数据框更友好,在这种情况下,函数已经矢量化。
我正在尝试在数据框中存储一些间隔。执行此操作的代码的简化版本如下:
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
对数据框更友好,在这种情况下,函数已经矢量化。