我有几个月的气象数据,分辨率为30分钟。我需要填补一些缺失的数据。在Excel中,我使用14天移动平均线填补空白。具体而言,如果数据缺口发生在上午11点,我仅在过去7天和接下来的7天的上午11点使用数据点来找到平均值。这在Excel中很简单,但我禁止自己使用它。我想要一个解决方案。必须有一个简单的答案,但我无法弄明白。
到目前为止,我尝试过使用rollmean和rollapply来自动物园。我从RcppRoll尝试了几种dpylr解决方案和roll_mean。我最接近修复的是动物园:: rollapply。我认为诀窍在于定义“width”和“align”参数。我需要测量窗口为672(每天48个数据点,超过14天),在缺失数据点的每一侧有336个,但我只想使用672系列中的第48个测量而我想忽略来港。另外,我想知道如何为间隙填充设置可用数据点的最低要求。时间序列开头和结尾的数据点应为NA。
我不打算从我的大量数据集中提供可重现的例子,但是这里可以用更小的尺度来玩:
data <- data.frame(hour =
c(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23),
values = c(1,3,1,3,1,3,1,3,1,NA,1,3,1,3,NA,3,1,3,1,3,1,3,1,3))
让我们尝试计算一个6小时滚动平均值来填充此数据集中的两个间隙,仅使用偶数小时的数据来填充甚至小时,以及从奇数小时到填充奇数小时的数据。因此,10:00的差距应为3,15:00的差距应为1。
我试过这个,它不起作用:
data$gap_fill <- rollapply(data$values, width = 6, by = 2, FUN = function(x) mean(x,
na.rm=TRUE), by.column=TRUE, partial=TRUE, fill=NA, align="center")
提前感谢您的帮助!
答案 0 :(得分:1)
rollapply
是适合这项工作的工具,但您的电话需要进行一些调整。
library(zoo)
data$gap_fill <- rollapply(
data = data$values,
width = 5,
FUN = function(x) {
same_oddity <- seq(1, length(x), by = 2)
mean(x[same_oddity], na.rm = TRUE)
},
partial = TRUE,
fill = NA,
align = "center"
)
data$imputed <- ifelse(
is.na(data$values),
data$gap_fill,
data$values
)
data
# hour values gap_fill imputed
# 1 0 1 1 1
# 2 1 3 1 3
# 3 2 1 1 1
# 4 3 3 3 3
# 5 4 1 1 1
# 6 5 3 3 3
# 7 6 1 1 1
# 8 7 3 3 3
# 9 8 1 1 1
# 10 9 NA 3 3
# 11 10 1 1 1
# 12 11 3 3 3
# 13 12 1 1 1
# 14 13 3 3 3
# 15 14 NA 1 1
# 16 15 3 3 3
# 17 16 1 1 1
# 18 17 3 3 3
# 19 18 1 1 1
# 20 19 3 3 3
# 21 20 1 1 1
# 22 21 3 3 3
# 23 22 1 1 1
# 24 23 3 3 3
我改变了什么:
by
参数表示只会在by
的{{1}}元素周围查看窗口。它不会影响data
的工作方式。您需要在FUN
。{/ li>中对窗口进行子集化
当FUN
呈矩阵状时,by.column
非常有用。它表示要为每个列执行该过程并返回一个矩阵。