问题---------
我有数以千计的时间序列文件(.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个条件:
每个标准必须按顺序完成,如果文件不符合要求,那么我必须创建不符合标准的文件的数据框(或任何列表)。
QUESTION --------
我想问社区如何解决这个问题。我已经考虑了嵌套if循环的值,以及使用sqldf,plyr,aggregate甚至dplyr。但我不知道实现这一目标的最简单方法。任何示例代码或建议都将非常感激。
答案 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
我相信这应该足以满足您的需求。关于闰年,您应该能够像我在评论中提到的那样修改优化函数。但是,请确保将闰年数据集指定为第二个数据集而不是第二个数据集。