计算和格式化时间间隔的平均值和平方

时间:2016-11-28 15:56:11

标签: r time

我有一个模型可以预测某些事件的持续时间,并测量这些事件的持续时间。然后我想计算预测和测量之间的差异,平均差异和RMSE。我能够做到这一点,但格式化确实很尴尬,而不是我的预期:

database <- data.frame(Predicted = c(strptime(c("4:00", "3:35", "3:38"), format = "%H:%M")),
                       Measured = c(strptime(c("3:39", "3:40", "3:53"), format = "%H:%M")))
database
>             Predicted            Measured
1 2016-11-28 04:00:00 2016-11-28 03:39:00
2 2016-11-28 03:35:00 2016-11-28 03:40:00
3 2016-11-28 03:38:00 2016-11-28 03:53:00

这是第一个奇怪:为什么R给我一个时间一个日期,即使我明确指定了一个仅限时间的格式(%H:%M),也没有日期在我的数据开始?它变得更奇怪了:

database$Error <- with(database, Predicted-Measured)
database$Mean_Error <- with(database, mean(Predicted-Measured))
database$RMSE <- with(database, sqrt(mean(as.numeric(Predicted-Measured)^2)))
> database
            Predicted            Measured    Error Mean_Error     RMSE
1 2016-11-28 04:00:00 2016-11-28 03:39:00  21 mins  0.3333333 15.17674
2 2016-11-28 03:35:00 2016-11-28 03:40:00  -5 mins  0.3333333 15.17674
3 2016-11-28 03:38:00 2016-11-28 03:53:00 -15 mins  0.3333333 15.17674

为什么变量Error以分钟表示?对于Error来说,这不是一个糟糕的选择,但对Mean_Error来说却很难阅读。对于RMSE,情况更糟,但这可能是由as.numeric函数引起的:如果删除它,R会抱怨'^' not defined for "difftime" objects。我的问题是:

  1. 是否可以显示Predicted格式中显示的前2列(Measured%H:%M)?
  2. 其他3列(ErrorMean_ErrorRMSE)我想在几秒钟内比较%M:%S格式和格式,并在二。可能吗?
  3. 编辑:为了更清楚,我的目标是将时间间隔的观察结果插入数据帧并计算时间间隔差异的向量。然后,计算该向量的一些统计数据:均值,RMSE等。我知道我可以在几秒钟内输入时间观察值,但这看起来并不是很好:很难说13200秒是3小时40分钟。因此,我希望能够将时间间隔存储在%H:%M中,但是能够以代数方式操作它们并以我选择的格式显示结果。这可能吗?

1 个答案:

答案 0 :(得分:1)

我们可以使用difftime来指定时间差异的单位。 difftime的输出是类difftime的对象。当使用difftime将此as.numeric对象强制转换为数字时,我们可以更改这些单位(请参阅?difftime中的示例):

## Note we don't convert to date-time because we just want %H:%M
database <- data.frame(Predicted = c("4:00", "3:35", "3:38"),
                       Measured = c("3:39", "3:40", "3:53"))
## We now convert to date-time and use difftime to compute difference in minutes
database$Error <- with(database, difftime(strptime(Predicted,format="%H:%M"),strptime(Measured,format="%H:%M"), units="mins"))
## Use as.numeric to change units to seconds
database$Mean_Error <- with(database, mean(as.numeric(Error,units="secs")))
database$RMSE <- with(database, sqrt(mean(as.numeric(Error,units="secs")^2)))
##  Predicted Measured    Error Mean_Error     RMSE
##1      4:00     3:39  21 mins         20 910.6042
##2      3:35     3:40  -5 mins         20 910.6042
##3      3:38     3:53 -15 mins         20 910.6042