【问题标题】:In R: how to conditionally use rollapply based on the number of NA values in the window?在 R 中:如何根据窗口中 NA 值的数量有条件地使用 rollapply?
【发布时间】:2020-03-29 17:52:03
【问题描述】:

基本问题:

我是 R 新手(以及一般编程),所以如果这篇文章的格式不正确,我深表歉意。我目前正在使用 R 对天气数据进行一些分析。简而言之,我需要取每个城市的最低气温的移动平均值,但即使在我指定的宽度 = 31 滚动窗口中最多有五个 NA 时,我也需要它来执行计算。

为了进行基本的滚动平均值计算,我一直在使用 zoo 包中的 rollapply:

library("dplyr")
library("zoo")

另外,如果有人想向我展示如何为未来的问题生成一些随机样本数据,那将非常有帮助。我的数据是一个包含三列的数据框:年份(整数)、城市(字符 - 在这种情况下都是“KASLO”和 MinTemp(数字,带有一些 NA 值)。数据框的名称与“城市”相同" 列(“KASLO”)。

我一直在使用基本代码来获取移动平均线,而不受 NA 值数量的限制:

MA <- rollapply(KASLO$MinTemp, width = 31, mean, fill = NA)
KASLO <- mutate(KASLO, "Moving Average" = MA)

这是一个好的开始,但由于数据的性质,多年来存在差距。即使滚动窗口内有多达 5 个 NA 值,我也需要程序为我提供输出。因此,例如,如果 31 宽度窗口中一年有 5 个 NA,则代码将使用 26 个现有值计算移动平均值。目前,除非窗口的 NA 值为零,否则输出会给出 NA。

我尝试了以下(和其他变体),但无济于事:

MA <- rollapply(KASLO$MinTemp, width = 31, function (x) if(length(which(!is.na(x))) >= 26) { mean(x) }, fill = NA)
KASLO <- mutate(KASLO, "Moving Average" = MA)

这提供了与我没有在函数/if 语句中添加相同的输出(即仅在不存在 NA 时计算 MA)。

非常感谢您对此任务的任何帮助!

【问题讨论】:

  • 欢迎来到堆栈。尝试给出一个最小的工作示例(请参阅minimal reproducible example)。在这里,据我了解,您只想给出一个带有一些连续 NAs 的向量,以及一个使用较短窗口的 rollapply 示例(例如 10)

标签: r smoothing rolling-computation rollapply


【解决方案1】:

这是一个示例数据集:

set.seed(246)
test <- sample(c(0,1),100,replace = T)
test[sample(1:100,50)] <- NA  
test  

  [1] NA  0 NA NA NA  1  1  0  1  1  1 NA NA  0  1  1  0 NA  1  0 NA  1  1  1 NA  1  1  1 NA  0 NA  0 NA  0 NA NA  0  0
 [39] NA  1  0  0 NA NA NA NA NA  1  1 NA NA  1 NA NA  1  1  0 NA  0  1 NA  1 NA NA NA  0 NA NA NA NA  0  0  0  1  0 NA
 [77] NA NA NA NA NA NA  1 NA NA NA NA NA  1  1  0 NA NA  1  0  0 NA NA  0 NA

这里有一个解决方案,对于 10 的窗口,如果窗口中的 NAs 少于 5 个,则计算平均值,否则为 NA

library(zoo)

rollapply(test, width = 10, function(x){
  if(sum(is.na(x))>4){
    NA
    }else{mean(x,na.rm = T)}
  }, fill = NA)


  [1]        NA        NA        NA        NA 0.6666667 0.7142857 0.8333333 0.8333333 0.7142857 0.7500000 0.7500000
 [12] 0.6250000 0.7142857 0.7142857 0.5714286 0.5000000 0.5714286 0.6250000 0.7500000 0.7142857 0.7142857 0.8571429
 [23] 0.8750000 0.8571429 0.8571429 0.8571429 0.7142857 0.6666667 0.5000000 0.5000000        NA        NA        NA
 [34]        NA        NA 0.1666667 0.1666667 0.1666667        NA        NA        NA        NA        NA        NA
 [45]        NA        NA        NA        NA        NA        NA        NA 0.8333333        NA        NA 0.6666667
 [56] 0.6666667 0.6666667 0.6666667 0.6666667        NA        NA        NA        NA        NA        NA        NA
 [67]        NA        NA        NA 0.1666667        NA        NA        NA        NA        NA        NA        NA
 [78]        NA        NA        NA        NA        NA        NA        NA        NA        NA        NA        NA
 [89]        NA        NA 0.5000000 0.5000000 0.5000000 0.3333333        NA        NA        NA        NA        NA
[100]        NA

【讨论】:

  • 丹尼斯,谢谢!现在我了解了您是如何创建示例数据集的,并且能够为未来的问题做类似的事情。此外,您对问题的解决方案与我的数据集完美配合,现在我很清楚它是如何工作的。干杯。
  • @RachelPals 很高兴它有帮助。如果解决方案有效,您可以对其进行验证
猜你喜欢
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 2017-01-30
  • 1970-01-01
相关资源
最近更新 更多