计算NAs r

时间:2018-01-18 14:21:12

标签: r na moving-average

我有几个月的气象数据,分辨率为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")

提前感谢您的帮助!

1 个答案:

答案 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非常有用。它表示要为每个列执行该过程并返回一个矩阵。