Lubridate创建区间运算符% - %抛出"' origin'必须提供" NA上的错误

时间:2015-01-15 12:54:05

标签: r na lubridate

Lubridate %--%间隔运算符会针对NA的某些配置而不是NA发出错误。特别是,为什么第四次调用以下%--%会返回错误?这是一个错误吗?

> library(lubridate)

> c(ymd("1980-10-14"), ymd("1980-10-14")) %--% c(ymd("1981-10-14"), ymd("1982-10-14"))
[1] 1980-10-14 10:00:00 AEST--1981-10-14 10:00:00 AEST
[2] 1980-10-14 10:00:00 AEST--1982-10-14 10:00:00 AEST

> c(ymd("1980-10-14"), NA) %--% c(ymd("1981-10-14"), ymd("1982-10-14"))
[1] 1980-10-14 10:00:00 AEST--1981-10-14 10:00:00 AEST
[2] NA--NA                                           

> c(NA, NA) %--% c(ymd("1980-10-14"), ymd("1982-10-14"))
[1] NA--NA NA--NA

> c(NA, ymd("1980-10-14")) %--% c(ymd("1981-10-14"), ymd("1982-10-14"))
Error in as.POSIXct.numeric(start) : 'origin' must be supplied

请注意

> NA %--% ymd("1981-10-14")
[1] NA--NA

> ymd("1981-10-14") %--% NA
[1] 1981-10-14 UTC--NA

2 个答案:

答案 0 :(得分:2)

异常发生在第四个示例中,因为c函数在第一个参数为NA时返回数字类向量。另一方面,当第一个参数是对`ymd:

的有效调用时,它返回一个POSIXct对象
library(lubridate)
  c(NA, ymd("1980-10-14"))
#[1]        NA 340329600

 class( c(NA, ymd("1980-10-14")) )
#[1] "numeric"
 library(lubridate)
  class( c( ymd("1980-10-14"))  )
#[1] "POSIXct" "POSIXt" 
  class( c( ymd("1980-10-14"), NA) )
#[1] "POSIXct" "POSIXt" 

这也可以解释其他异常情况。可能需要修改一些高于我的工资等级的代码。

> getAnywhere(c.POSIXct)
2 differing objects matching ‘c.POSIXct’ were found
in the following places
  package:base
  registered S3 method for c from namespace base
  namespace:base
  namespace:lubridate
Use [] to view one of them

答案 1 :(得分:2)

这是因为c(NA,thing)不会被视为c(thing,NA)

> is.POSIXct(c(NA, ymd("1980-01-01")))
[1] FALSE
> is.POSIXct(c(ymd("1980-01-01"),NA))
[1] TRUE

在第一种情况下,使用base::c,因为第一个参数是NA。在第二种情况下,调用c.POSIXct是因为第一个参数是POSIXct。因此,在第一种情况下,所有内容都会减少到数字向量。

可能的解决方法是不构造这样的向量:

> c(NA, ymd("1980-10-14")) %--% c(ymd("1981-10-14"), ymd("1982-10-14"))
Error in as.POSIXct.numeric(start) : 'origin' must be supplied

但是要使用ymd来构建正确类型的向量,方法是在向量​​中提供带有NA的向量:

> ymd(c(NA, "1980-10-14")) %--% ymd(c("1981-10-14","1982-10-14"))
[1] NA--NA                         1980-10-14 UTC--1982-10-14 UTC

请注意%--%运算符的代码可以通过键入interval来查看 - 它只是一个别名。

仍然很奇怪NA %--% ymd()是NA-NA但ymd() %--% NA有一个有效的开始......可能是另一个错误。