繁体   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