r - 插补后操作动物园对象列
问题描述
我有一个大型的每小时时间序列数据集,显示不同时间的温度。该系列中有许多缺失值 (NA),因此我使用线性插值来使用 imputeTS 包估算缺失值。在插值之前,我被告知要为估算值创建一个列作为动物园对象。这用推算的温度替换了任何 NA 温度。
我正在做采暖度日分析,这是将建筑物加热到室温所需的加热。如果室外温度低于 15.5 度,则需要加热。我希望忽略(或设置为 NA)高于 15.5 的值,只关注以下温度。然后我想计算加热度天数,即(15.5-Temp)*1/24(一天 24 小时)。这通常很简单,但是我在处理动物园对象时遇到了麻烦。有人可以帮忙吗??
数据示例如下:
DateTimes <- as.POSIXct(c("2009-01-01 00:00:00", "2009-01-01 01:00:00", "2009-01-01 02:00:00", "2009-01-01 03:00:00", "2009-01-01 04:00:00", "2009-01-01 05:00:00", "2009-01-01 06:00:00"))
MeanTemp <- c(0.8, 0.7, 0.7, NA, 0.8, 0.9, 1.1)
HourTemp <- data.frame(DateTimes, MeanTemp)
这些是我的插补步骤:
#Use linear interpolation to impute missing values
TempImp <- zoo(HourTemp$MeanTemp, HourTemp$DateTimes)
TempImp <- imputeTS::na.interpolation(TempImp, option = "linear")
#Add imputed values to data
as.data.frame(HourTemp)
HourTemp$airTempImp <- round(TempImp,1)
#Add imputed flag
HourTemp$Imputed <- ifelse(is.na(HourTemp$MeanTemp), "Imputed", "Observed")
HourTemp
插补工作成功,用估计值替换了 NA 值,但我无法操纵动物园对象“airTempImp”来创建开头段落中指定的加热度天数列。
我尝试过使用 ifelse、ifelse.zoo、transform 但似乎都没有工作!
谢谢!
解决方案
听起来您还没有将zoo
对象转换为更通用的 R 对象(但您没有给出错误消息或产生它的代码,所以我不能 100% 确定)。
在这种情况下,您可以使用该as.vector
功能(请参阅https://www.rdocumentation.org/packages/zoo/versions/1.8-6/topics/as.zoo)将zoo
对象转换为 a vector
,您可以将其添加到一个数据框。
下面的示例代码删除imputeTS
了 ,就像G. Grothendieck在他的评论中所说的那样,因为动物园na.approx
做了线性插值。
# install.packages("zoo")
library("zoo")
DateTimes <- as.POSIXct(c(
"2009-01-01 00:00:00", "2009-01-01 01:00:00",
"2009-01-01 02:00:00", "2009-01-01 03:00:00",
"2009-01-01 04:00:00", "2009-01-01 05:00:00", "2009-01-01 06:00:00"))
MeanTemp <- c(0.8, 0.7, 0.7, NA, 0.8, 0.9, 1.1)
HourTemp <- data.frame(DateTimes, MeanTemp)
TempImp <- zoo(HourTemp$MeanTemp, HourTemp$DateTimes)
# use zoo's linear interpolation
HourTemp$airTempImp <- as.vector(na.approx(TempImp))
HourTemp$Imputed <- ifelse(is.na(HourTemp$MeanTemp), "Imputed", "Observed")
# calculates the heating degree day per hour if temp > 15.5,
# else sets to 0 (no heating)
HourTemp$HeatingDegreeDay <- ifelse(
HourTemp$airTempImp > 15.5,
0, # no heating
(15.5 - HourTemp$airTempImp) / 24
)
这将输出:
HourTemp
DateTimes MeanTemp airTempImp Imputed HeatingDegreeDay
1 2009-01-01 00:00:00 0.8 0.80 Observed 0.6125000
2 2009-01-01 01:00:00 0.7 0.70 Observed 0.6166667
3 2009-01-01 02:00:00 0.7 0.70 Observed 0.6166667
4 2009-01-01 03:00:00 NA 0.75 Imputed 0.6145833
5 2009-01-01 04:00:00 0.8 0.80 Observed 0.6125000
6 2009-01-01 05:00:00 0.9 0.90 Observed 0.6083333
7 2009-01-01 06:00:00 1.1 1.10 Observed 0.6000000
推荐阅读
- django - Wagtail – 将作者添加到 blogpost 模型
- kubernetes - Gitlab 安装的 Helm:错误:超出上下文截止日期
- android - 防止 AppBarLayout.ScrollingViewBehavior 向视图添加上边距?
- awk - 如何使用参考列表有选择地从文件中检索特定行和附近行?
- ios - 应用程序的本地化不会改变应用程序中使用的 cocoapods 的语言
- mxnet - 如何将 mxnet 参数文件解析为纯文本?
- java - 动态识别实体类和 JPA 接口
- modal-dialog - 如何在桌面上禁用引导模式并仅对移动/平板电脑启用?
- php - 对数据库中的双精度值进行排序
- mysql - 检查 ID 是否存在于另一个表中,如果是则返回 TRUE