我正在操纵三个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) )
当我使用'哪个(开始<=“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'已经是其性质的列表,'sapply'无法处理它。这里提供的向量元素是从我的consol中复制出来的,这就是为什么它们与字符类似。在我的程序中,它们绝对是'Date'对象。有没有办法,将它们转换为POSIXct
的一部分,这样做?非常感谢您的帮助。
lubridate包可以帮助解决这个问题。所有都需要转换为日期/时间对象,否则比较将它们比较为字符串,即“b”>“a”而不是间隔。下面是一个解决方案,我很困惑你的开始和结束向量是如何使用的。在您的示例中,每个inc值将大于任何最小值;并且对于每个inc小于任何最大结束。所以目前尚不清楚这些是否意味着以某种方式成对?下面假设以min(开始)开始,以max(end)结束。
同时,当没有值匹配时,which()将返回一个空整数。这也可能与开始/结束向量如何交互有关:如果一个inc值大于第一个值而不是其他值,它将返回TRUE FALSE FALSE然后如果它小于一个结束值并返回FALSE FALSE TRUE,那里将不会为TRUE FALSE FALSE和FALSE FALSE UNUE,因此总是返回空。
library(lubridate)
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")
inc <- as_datetime(inc)
start <- min(as_date(start))
end <- max(as_datetime(end))
inc[which(inc >= start & inc <= end)]
> inc[which(inc >= start & inc <= end)]
[1] "2007-09-17 18:45:00 UTC" "2007-09-17 19:00:00 UTC" "2007-09-17 19:15:00 UTC" "2007-09-17 19:30:00 UTC"