当在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
答案 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
方法处理,而对象的存储值保持一致。