在R中:如何根据窗口中NA值的数量有条件地使用rollapply?

基本问题:

我是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,function (x) if(length(which(!is.na(x))) >= 26) { mean(x) },"Moving Average" = MA)

这提供了与我未在function / if语句中添加的输出相同的输出(即,仅当不存在NA时才计算MA)。

在此任务上的任何帮助都将不胜感激!

zmm22 回答:在R中:如何根据窗口中NA值的数量有条件地使用rollapply?

这是一个示例数据集:

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窗口的解决方案,如果窗口中少于5个NAs,则计算平均值,否则给出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
本文链接:https://www.f2er.com/2974686.html

大家都在问