确保R中的时间数据密度

时间:2014-03-31 01:51:26

标签: r datetime sampling

问题---------

我有数以千计的时间序列文件(.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%的小时数是NA
  2. 确保一个月内不超过10%的天数为NA
  3. 确保连续3年的数据具有有效的日期和月份。
  4. 每个标准必须按顺序完成,如果文件不符合要求,那么我必须创建不符合标准的文件的数据框(或任何列表)。

    QUESTION --------

    我想问社区如何解决这个问题。我已经考虑了嵌套if循环的值,以及使用sqldf,plyr,aggregate甚至dplyr。但我不知道实现这一目标的最简单方法。任何示例代码或建议都将非常感激。

1 个答案:

答案 0 :(得分:0)

我认为这对你有用。这些将在第二天,每月或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

<强>优化: 我花时间用上面发布的数据来运行这些函数,但这并不好。因为循环是危险的,因为它们适用于小型数据集,但随着数据集变大而呈指数级减速,即如果它们构造不正确。我无法使用您的数据报告上述功能的系统时间(它从未完成),但我等了大约30分钟。在阅读了这篇很棒的帖子Speed up the loop operation in R之后,我重写了这些功能要快得多。通过最小化循环中发生的事情并预先分配内存,您可以真正加快速度。您需要像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 

我相信这应该足以满足您的需求。关于闰年,您应该能够像我在评论中提到的那样修改优化函数。但是,请确保将闰年数据集指定为第二个数据集而不是第二个数据集。