簡體   English   中英

確保R中的時間數據密度

[英]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個條件:

  1. 確保一天中不超過10%的小時是不適用的
  2. 確保一個月中不超過10%的天是NA
  3. 確保連續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.

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