首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算后操作动物园对象列

计算后操作动物园对象列
EN

Stack Overflow用户
提问于 2019-09-18 10:13:42
回答 2查看 205关注 0票数 0

我有一个很大的时间序列数据集,显示不同时间的温度。在这个系列中有许多缺失值(NA),所以我使用线性插值来使用imputeTS包来计算缺失的值。在插值之前,我被告知要为作为动物园对象的计算值创建一个列。这取代了任何NA的温度和推测的温度。

我正在做采暖度日分析,这是一个建筑物加热到室温所需的暖气。如果室外温度低于15.5度,则需要加热。我希望忽略(或设置为NA) 15.5以上的数值,只关注以下的温度。然后,我想计算加热度日,它是(15.5-温度)*1/24(一天24小时)。这通常很简单,但是我对动物园的东西有麻烦。有人能帮忙吗?

数据的一个例子是:

代码语言:javascript
复制
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) 

以下是我的归罪步骤:

代码语言:javascript
复制
#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,但是似乎没有一个在工作!

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-18 14:00:30

听起来好像您还没有将zoo对象转换成一个更通用的R对象(但是您没有给出产生它的错误消息或代码,所以我不能100%肯定)。

在这种情况下,您可以使用as.vector函数(参见https://www.rdocumentation.org/packages/zoo/versions/1.8-6/topics/as.zoo)将zoo对象转换为vector,您可以将其添加到data.frame中。

下面的示例代码删除了imputeTS,就像G. Grothendieck在评论中说的一样,因为动物园的na.approx做线性插值。

代码语言:javascript
复制
# 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
)

将产生以下结果:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2020-02-10 23:30:28

您的解决方案太复杂了--因为您似乎想要一个data.frame,所以不需要将数据转换为动物园对象。

直接将na_interpolationimputeTS应用于data.frame (imputeTS可以处理各种输入,例如data.framevectorzootsxtstibbletsibble)

只是:

代码语言:javascript
复制
library(imputeTS)
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)

Imputed <- imputeTS::na.interpolation(HourTemp, option = "linear")

在本例中,imputeTS将忽略日期列并填充数据列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57990351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档