[英]Ensuring temporal data density in R
問題 - - - - -
我有數千個時間序列文件(.csv),其中包含20到50年之間的間歇數據(請參閱df)。 每個文件都包含date_time和一個度量標准(溫度)。 數據是每小時一次,沒有測量值的地方會顯示“ NA”。
>df
date_time temp
01/05/1943 11:00 5.2
01/05/1943 12:00 5.2
01/05/1943 13:00 5.8
01/05/1943 14:00 NA
01/05/1943 15:00 NA
01/05/1943 16:00 5.8
01/05/1943 17:00 5.8
01/05/1943 18:00 6.3
我需要檢查這些文件以查看它們是否具有足夠的數據密度。 即NA與數據值的比率不是太高。 為此,我必須為每個文件檢查3個條件:
必須依次滿足每個條件,如果文件不符合要求,那么我必須為不滿足條件的文件創建一個數據框(或任何列表)。
題 - - - -
我想問社區如何做。 我考慮了嵌套if循環的值,以及使用sqldf,plyr,aggregate甚至dplyr的值。 但是我不知道實現這一目標的最簡單方法。 任何示例代碼或建議將不勝感激。
我認為這對您有用。 這些將在第二天,每月或3年內每小時檢查一次NA。 未測試,因為我不在乎組成數據來對其進行測試。 這些功能應吐出相應時間段內的NA數。 因此,對於函數檢查日,如果它返回的值大於2.4,則根據您的10%規則,您將遇到問題。 對於72個月和3年期,您希望值小於2628。再次請檢查這些功能。 順便說一下,這些功能假定您的NA數據在第2列中。
checkdays <- function(data){
countNA=NULL
for(i in 1:(length(data[,2])-23)){
nadata=data[i:(i+23),2]
countNA[i]=length(nadata[is.na(nadata)])}
return(countNA)
}
checkmonth <- function(data){
countNA=NULL
for(i in 1:(length(data[,2])-719)){
nadata=data[i:(i+719),2]
countNA[i]=length(nadata[is.na(nadata)])}
return(countNA)
}
check3years <- function(data){
countNA=NULL
for(i in 1:(length(data[,2])-26279)){
nadata=data[i:(i+26279),2]
countNA[i]=length(nadata[is.na(nadata)])}
return(countNA)
}
所以我最終測試了這些。 他們為我工作。 這是一年的數據集的系統時間。 所以我認為您不會有問題。
> system.time(checkdays(RM_W1))
user system elapsed
0.38 0.00 0.37
> system.time(checkmonth(RM_W1))
user system elapsed
0.62 0.00 0.62
優化:我花了一些時間使用上面發布的數據來運行這些功能,但這並不好。 For循環很危險,因為它們適用於較小的數據集,但是隨着數據集的增大(即如果它們的構造不正確)而呈指數級降低。 我無法使用您的數據報告上述功能的系統時間(從未完成),但我等待了大約30分鍾。 閱讀了這篇很棒的文章后,我在R中加快了循環操作的速度,將功能重寫了很多。 通過最大程度地減少循環中發生的事情並預先分配內存,您可以真正加快速度。 您需要像checkdays(df[,2])
那樣調用該函數checkdays(df[,2])
但這種方法速度更快。
checkdays <- function(data){
countNA=numeric(length(data)-23)
for(i in 1:(length(data)-23)){
nadata=data[i:(i+23)]
countNA[i]=length(nadata[is.na(nadata)])}
return(countNA)
}
> system.time(checkdays(df[,2]))
user system elapsed
4.41 0.00 4.41
我相信這應該足以滿足您的需求。 關於leap年,您應該能夠修改我在評論中提到的優化功能。 但是,請確保將specify年數據集指定為第二數據集而不是第二列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.