【问题标题】:Running average over "day of year" data“一年中的一天”数据的运行平均值
【发布时间】:2018-03-01 01:45:27
【问题描述】:

我试图弄清楚如何将我平均为“一年中的一天”数据的数据平滑。我已将下面示例代码中的问题尽可能简化。在我的实际脚本中,我计算了一个数据框,该数据框具有从 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 <- ?

【问题讨论】:

  • 如果答案解决了您的问题,请accept it;这样做不仅为回答者提供了一些积分,而且还为有类似问题的读者提供了一些关闭。尽管您只能接受一个答案(当提供多个答案时),但您可以选择对您认为有帮助的多个答案进行投票。 (如果仍有问题,您可能需要编辑您的问题并提供更多详细信息。)

标签: r mean


【解决方案1】:

如果您已经知道如何进行移动平均,只需将数据复制到自身末尾,计算移动平均,然后再次对其进行限制。例如

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 函数使用索引列以正确的顺序获取数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多