вектор POSIXct и Саппи - PullRequest
       14

вектор POSIXct и Саппи

2 голосов
/ 06 июля 2010

Что если вы хотите применить функцию, отличную от format, к списку объектов POSIXct?Например, скажем, я хочу взять вектор времен, усечь это время до часа и применить произвольную функцию к каждому из этих времен.

> obs.times=as.POSIXct(c('2010-01-02 12:37:45','2010-01-02 08:45:45','2010-01-09 14:45:53'))
> obs.truncated=trunc(obs.times, units="hours")
> obs.truncated
[1] "2010-01-02 12:00:00 EST" "2010-01-02 08:00:00 EST"
[3] "2010-01-09 14:00:00 EST"

Теперь я ожидаю длину obs.truncated будет 3, но

> length(obs.truncated)
[1] 9

Итак, вы можете видеть, что попытка apply функции для этого вектора не сработает.Класс obs.truncated является

> class(obs.truncated)
[1] "POSIXt"  "POSIXlt"

Есть идеи, что здесь происходит?apply и length, кажется, принимают первый элемент вектора как свой собственный список.

1 Ответ

1 голос
/ 07 июля 2010

length() такого POSIXlt раньше сообщалось как девять, но это было недавно исправлено.

Кроме того, когда я делаю trunc(obs.times), происходит неправильная вещь - trunc() действует только один раз на строке из трех элементов.вам нужно apply() и др.

Так вот пример использования sapply() с компонентным сбросом:

> sapply(obs.times, function(.) {
+ p <- as.POSIXlt(.); 
+ p$min <- p$sec <- 0; 
+ format(p) })
[1] "2010-01-02 12:00:00" "2010-01-02 08:00:00" "2010-01-09 14:00:00"
> 

Принимая во внимание

> trunc(obs.times, units="hours")
[1] "2010-01-02 12:00:00 CST" "2010-01-02 08:00:00 CST"
[3] "2010-01-09 14:00:00 CST"
> class(trunc(obs.times, units="hours"))
[1] "POSIXt"  "POSIXlt"
> length(trunc(obs.times, units="hours"))
[1] 1
> 
...