簡體   English   中英

在 R 中:如何根據窗口中 NA 值的數量有條件地使用 rollapply?

[英]In R: how to conditionally use rollapply based on the number of NA values in the window?

基本問題:

我是 R(以及一般編程)的新手,所以如果這篇文章的格式不正確,我深表歉意。 我目前正在使用 R 對天氣數據進行一些分析。 簡而言之,我需要取每個城市的最低溫度的移動平均值,但即使我指定的寬度 = 31 滾動窗口中最多有五個 NA,我也需要它來執行計算。

為了進行基本的滾動平均計算,我一直在使用 zoo 包中的 rollapply:

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

此外,如果有人想向我展示如何為未來的問題生成一些隨機樣本數據,那將非常有幫助。 我的數據是一個包含三列的數據框:Year(整數)、City(字符 - 在這種情況下都是“KASLO”和 MinTemp(數字,帶有一些 NA 值)。數據框的名稱與“City”相同" 列(“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)

這提供了與我沒有在 function/if 語句中添加一樣的輸出(即,如果不存在 NA,則僅計算 MA)。

非常感謝對此任務的任何幫助!

這是一個示例數據集:

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 10 ,則計算平均值,否則給出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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM