[英]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.