在“一年中的一天”数据上运行平均值

时间:2018-03-01 01:45:27

标签: r mean

我正在试图弄清楚如何将我平均的数据平滑到“一年中的一天”数据。我已将下面的示例代码中的问题简化为最小可能。在我的实际脚本中,我计算了一个数据框,其中包含从1到365的“一年中的一天”索引列和第二列,该列是多年中该年中某一天的特定度量的平均值。我试图通过计算此数据的居中运行平均值(例如11天)来进一步平滑数据。

我正在努力弄清楚如何有效地处理“日历中断”,这意味着在“日期”数据的开始和结束时,我需要将DoY = 365转换回DoY = 1。当平均值的中心从白天= 360到白天= 5时,如何计算平均值?

我开始将解决方案整合在一起,但很快就达到了优雅的代码。有没有一种有效的方法来做到这一点?

以下示例提供了包含试用数据的示例数据框。

# A simulated daily time series average
ann_data <- data.frame(day=seq(1,365,1), data=
(sin(pi*seq(1:365)/182+90)+rnorm(365)/10)) 
plot(ann_data)

ann_data_smooth <- ?

1 个答案:

答案 0 :(得分:0)

如果您已经知道如何进行运行平均值,只需将数据复制到自身的末尾,计算运行平均值,然后再次限制它。 E.g。

yearDataLength <- length(yearData)
yearData <- c(yearData, yearData)
runningAve <- running_average_function(yearData)[1:yearDataLength]

running_average_function是您当前使用的任何功能。 1:yearDataLength位只会限制应用函数后的范围。在对这样的周期性数据进行平滑处理时,这是相当常见的。如果你需要开始与结束排队,那么取1:yearDataLength取中间50%的数据而不是前50%。

修改 重新阅读后,我发现你也开始关注这个问题。这意味着如果您使用上述方法,您可以从5:(yearDataLength+4)获取数据(仅为5:369)。这为日历中断计算提供了所需的空间。

您的索引仍应与副本保持一致,因此一旦您拥有该范围,只需使用sort函数,使用索引列以正确的顺序恢复数据。