【问题标题】:vector of POSIXct and sapplyPOSIXct 和 sapply 的向量
【发布时间】:2010-07-06 19:29:27
【问题描述】:

如果您想将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 似乎将向量的第一个元素作为自己的列表。

【问题讨论】:

  • 不知道为什么会发生这种情况:我运行了你的命令,得到了 length(obs.truncated) == 3...但我从以下得到了 9:length(unclass(obs.truncated))
  • 我正在使用:R 版本 2.10.1 (2009-12-14) x86_64-pc-linux-gnu
  • 长话短说:升级到 R 2.11 或使用除 trunc 以外的其他东西,正如 Dirk 在下面所说的那样。

标签: r posixct sapply


【解决方案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
> 

【讨论】:

  • OP 在问题中包含class 命令。此外,当我调用 trunc 时,它适用于整个向量。但你是对的:我可以使用 R 2.10.0 复制 9 计数,但它已在我的 R 2.11.1 控制台中更正。
  • 很好,但我仍然对你的第二段感到困惑。这就是我得到的:base::trunc(obs.times, units="hours") >> [1] "2010-01-02 12:00:00 EST" "2010-01-02 08:00:00 EST" "2010-01-09 14:00:00 EST"(与 OP 示例相同)。我还查看了$sec$min 插槽,它们都是零。
  • 我把它扔进了主帖。 length() == 1 看起来很可疑。 R 2.11.0。
  • 我在 Windoze 上的 R 2.11.1 中得到 length(trunc(obs.times, units="hours")) >> 3。多么奇怪!
  • 可能是在 .0 和 .1 之间修复的错误!
猜你喜欢
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多