向量的POSIXct和sapply

时间:2010-07-06 19:29:27

标签: r posixct sapply

如果要将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"

知道这里发生了什么吗? applylength似乎将向量的第一个元素作为自己的列表。

1 个答案:

答案 0 :(得分:1)

此类POSIXlt的length()曾被报告为9,但最近得到纠正。

此外,当我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
>