R: использование sapply для объектов даты - PullRequest
0 голосов
/ 07 марта 2019

Я манипулирую тремя 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 по Гринвичу »и конец> = 2007-09-17 18:45:00 по Гринвичу)’ работает правильно и возвращает 1 . Проблема возникает, только если я хочу применить «Саппи». это дает странные результаты:

$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)

В этом вопросе я обнаружил, что, поскольку «POSIXct» уже является списком по своей природе, «sapply» не может с ним справиться. Элементы векторов, представленные здесь, скопированы из моего консоля, и поэтому они похожи на символы. В моей программе это определенно объекты Date. Есть ли способ, часть из преобразования их в POSIXct, чтобы сделать это? Ваша помощь будет оценена.

1 Ответ

0 голосов
/ 07 марта 2019

lubridate package может помочь в этом. Все они должны быть преобразованы в объекты даты / времени, иначе сравнение будет сравнивать их как строки, то есть «b»> «a», а не как интервалы. Ниже приведено решение, я запутался, как использовать ваш вектор начала и конца. В вашем примере каждое значение inc будет больше любого минимального начала; и для каждого inc меньше чем любой максимальный конец. Так что не ясно, должны ли они быть парами? Ниже предполагается, что начало - это минимум (начало), а конец - максимум (конец).

Между тем, который () будет возвращать нулевое целое число, когда вы получаете, когда никакие значения не совпадают. Это также может быть связано с тем, как взаимодействуют начальный / конечный векторы: если значение inc больше первого значения, а не других, оно вернет TRUE FALSE FALSE, а затем, если оно меньше конечного значения, и вернет FALSE FALSE TRUE, не будет объединением TRUE FALSE FALSE и FALSE FALSE TRUE, поэтому всегда будет пустым.

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"
...