我正在操纵三个date objects (class : "POSIXlt" "POSIXt")
。前两个向量(start
和end
)定义了一些间隔的起点和终点,而第三个向量(inc
)则对应了一些事件。我要检测的是,哪个事件发生在哪个时间间隔内。我减小了向量的大小,以提供一个有效的示例。否则,向量的实际长度会很大。
start <- c("2007-09-16 18:40:27 GMT","2007-09-28 23:53:55 GMT", "2007-10-25 05:23:01 GMT")
end <- c("2007-09-19 18:40:27 GMT", "2007-10-01 23:53:55 GMT","2007-10-28 05:23:01 GMT")
inc <- c("2007-09-17 18:45:00 GMT", "2007-09-17 19:00:00 GMT", "2007-09-17 19:15:00 GMT", "2007-09-17 19:30:00 GMT")
这是检测相应日期的简单代码:
quel.eve <- sapply( inc, function(s)
which(start <= s & end >=s) )
当我使用 ‘which(开始<=“ 2007-09-17 18:45:00 GMT”和结束> = 2007-09-17 18:45:00 GMT)’可以正常工作并返回1。仅当我要应用“ sapply”时,问题才会出现。它给出了一些奇怪的结果:
$sec
integer(0)
$min
integer(0)
$hour
integer(0)
$mday
integer(0)
$mon
integer(0)
$year
integer(0)
$wday
integer(0)
$yday
integer(0)
$isdst
integer(0)
在此question中,我发现由于POSIXct本质上已经是一个列表,因此“ apply”无法处理。这里提供的vector元素是从我的控制台中复制的,这就是为什么它们类似于字符的原因。在我的程序中,它们绝对是“日期”对象。
有没有办法将它们转换为POSIXct
?您的帮助将不胜感激。
答案 0 :(得分:0)
lubridate软件包可以帮助您解决此问题。所有的确需要转换为日期/时间对象,否则比较会将它们比较为字符串,即“ b”>“ a”而不是间隔。下面是一个解决方案,我很困惑如何使用起始向量和结束向量。在您的示例中,每个inc值都将大于任何最小起始值;并且每个inc的上限都小于上限。因此,尚不清楚它们是否以某种方式配对。下面假设开始为min(开始),结束为max(结束)。
同时,当没有值匹配时,which()将在您接收时返回一个空整数。这也可能与开始/结束向量的交互方式有关:如果inc值大于第一个值而不是其他值,则它将返回TRUE FALSE FALSE,然后小于结束值并返回FALSE FALSE TRUE,则不会是TRUE FALSE FALSE和FALSE FALSE TRUE的并集,因此始终会返回空。
{{1}}