R:使用sapply作为日期对象

问题描述 投票:0回答:1

我正在操纵三个date objects (class : "POSIXlt" "POSIXt")。两个第一个向量(startend)定义了一些区间的起点和终点,第三个向量(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的一部分,这样做?非常感谢您的帮助。

r datetime sapply
1个回答
0
投票

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"
© www.soinside.com 2019 - 2024. All rights reserved.