使用POSIXct算法在data.table中显示错误的单位

时间:2014-08-09 00:46:45

标签: r data.table posixct

当在data.table(v1.9.2)中计算持续时间时,可以使用POSIXct算法打印错误的单位。似乎首先选择了单位。

require("data.table")
dt <- data.table(id=c(1,1,2,2), 
                  event=rep(c("start", "end"), times=2), 
                  time=c(as.POSIXct(c("2014-01-31 06:05:30", 
                                      "2014-01-31 06:45:30", 
                                      "2014-01-31 08:10:00", 
                                      "2014-01-31 09:30:00"))))
dt$time[2] - dt$time[1]  # in minutes
dt$time[4] - dt$time[3]  # in hours
dt[ , max(time) - min(time), by=id]  # wrong units printed for id 2

我意识到其中一个是获得预期行为的正确方法,但是想报告这种行为。不确定它是否真的是data.table问题或POSIXct问题。

dt[ , difftime(max(time), min(time), units="mins"), by=id]  # both in mins
dt[ , difftime(max(time), min(time), units="hours"), by=id]  # both in hours

3 个答案:

答案 0 :(得分:3)

如果你做了

,你将得到预期的结果
dt[ , list(c(max(time) - min(time)),attr(max(time) - min(time),"units")), by=id]

在时间操作周围放置c()会消除属性,因此您只需获取一个数字,然后明确要求"units"属性作为另一个列表元素,它自己在其自己的列中获取正确的单位。没有这样做的原因是data.table没有将属性解析为其他列,这就是POSIXct返回单位的方式。


来自马特:

+1只需添加一小段速度以保存max(time)-min(time)两次:

dt[ , list(c(d<-max(time) - min(time)), attr(d,"units")), by=id]
   id        V1    V2
1:  1 40.000000  mins
2:  2  1.333333 hours

至少首先,我想我们会在组结果中添加对不一致属性的检查,然后发出警告/错误。因此,无论如何都可能需要这个解决方案(或问题中的解决方案)。

答案 1 :(得分:2)

这可以被视为操作员错误,因为您的表(自动)显示difftime的数字等效值,但您没有指定显示答案的单位。在大多数情况下,您希望导出/显示difftime值应在显式转换为数字时指定所需的单位。 E.g。

dt[ , as.numeric( max(time) - min(time), units="hours" ), by=id]

答案 2 :(得分:0)

强制单位是修复#761之前的方法。这是另一种选择:

dt[ , difftime(max(time), min(time), units = 'mins'), by = id]
#    id      V1
# 1:  1 40 mins
# 2:  2 80 mins

如果您愿意,这可以保留输出class的{​​{1}}。

我发现R的行为从根本上改变了基于difftime属性的difftime对象的内容,这很奇怪。在R中的其他位置,此转换将仅由units方法处理,而对象的存储值保持一致。