R 添加到 difftime 向量会忘记单位

Posted

技术标签:

【中文标题】R 添加到 difftime 向量会忘记单位【英文标题】:R adding to a difftime vector forgets about the units 【发布时间】:2014-12-04 11:25:27 【问题描述】:

当我通过另一个 difftime 对象扩展 difftimes 向量时,似乎添加项目的单位被忽略并覆盖而不进行转换:

> t = Sys.time()
> d = difftime(c((t+1), (t+61)), t)
> d
Time differences in secs
[1]  1 61

> difftime(t+61, t)
Time difference of 1.016667 mins

> d[3] = difftime(t+61, t)
> d
Time differences in secs
[1]  1.000000 61.000000  1.016667
> as.numeric(d)
[1]  1.000000 61.000000  1.016667

这是在 R 3.1.0 中。这种行为有合理的解释吗?我只是想以这种方式存储一些时差以供以后使用,完全没想到会这样。我没有在任何地方找到这个记录..

好的,现在我只是帮助自己始终指定单位:

> d[3] = difftime(t+61, t, unit="secs")
> d
Time differences in secs
[1]  1 61 61

【问题讨论】:

R 的这种行为非常糟糕!在这件事之后,我突然对生活感到更糟了。 我也认为这值得修复或至少在文档中发出警告。 【参考方案1】:

来自help("difftime")

如果 units = "auto",则选择一组合适的单位,即所有绝对差均大于 1 的最大可能单位(不包括“周”)。

units = "auto" 是默认值。因此,对于 1 秒和 61 秒的差异,如果您要选择分钟,

difftime(c((t+1), (t+61)), t, units = "min")
# Time differences in mins
# [1] 0.01666667 1.01666667

其中一个小于一,因此默认情况下,由于您没有指定单位,R 根据上述指南为您选择了它们。此外,单位与对象一起保存

d <- difftime(c((t+1), (t+61)), t)
units(d)
# [1] "secs"

但是你可以用units&lt;-改变单位

d[3] <- difftime(t+61, t)
d
# Time differences in mins
# [1] 0.01666667 1.01666667 1.01666667
units(d) <- "secs"
d
# Time differences in secs
# [1]  1 61 61

【讨论】:

好的,谢谢,这是有道理的。因此,单位只是我分配新值时未检查的向量的一个属性。我想我希望这个分配更聪明 - 毕竟当我将字符串添加到数字向量时会有相当多的类型转换。 您可以使用units(d) &lt;- "mins" 更改单位并重新计算

以上是关于R 添加到 difftime 向量会忘记单位的主要内容,如果未能解决你的问题,请参考以下文章

反射向量 及 向量投影

【R】数值型向量及运算

R:向向量的某些索引添加值

在R中添加带有条件的向量元素

r函数知识总结

如何在R中的一个向量中累积添加值