具有每小时数据的R ifelse条件:连续NA的频率

时间:2012-08-17 18:46:54

标签: r

在sebastian-c的帮助下,我发现了日常数据的问题。请参阅:R ifelse condition: frequency of continuously NA

现在我有一个包含每小时数据的数据集:

set.seed(1234)  
day <- c(rep(1:2, each=24))  
hr <- c(rep(0:23, 2))  
v <- c(rep(NA, 48))   
A <- data.frame(cbind(day, hr, v))  
A$v <- sample(c(NA, rnorm(100)), nrow(A), prob=c(0.5, rep(0.5/100, 100)), replace=TRUE)  

我需要做的是:如果有更多(&gt; =)4连续缺少白天工作时间(上午7点至下午7点)或> = 3连续缺少夜间工作时间(晚上7点至上午7点),我将删除从数据帧开始整天,否则只需运行线性插值。因此,应该从数据帧中完全删除第二天,因为在白天(7 AM-10AM)期间连续有4个NA。结果优选地保持数据帧。请帮忙,谢谢!

1 个答案:

答案 0 :(得分:1)

如果我从您链接的问题修改NA_run函数,则采用名为v的变量而不是value并返回布尔值而不是data.frame:

NA_run <- function(x, maxlen){
  runs <- rle(is.na(x$v))
  any(runs$lengths[runs$values] >= maxlen)
}

然后我可以编写一个包装函数来为白天和夜晚调用它两次:

dropfun <- function(x) {
  dt <- x$hr > 7 & x$hr < 19
  daytime <- NA_run(x[dt,], 4)
  nighttime <- NA_run(x[!dt,], 3)

  any(daytime, nighttime)
}

这给了我一个数据框架的天数。

> ddply(A, .(day), dropfun)
  day    V1
1   1  TRUE
2   2 FALSE
> 

我们可以改变dropfun以返回数据帧,但是:

dropfun <- function(x) {
  dt <- x$hr > 7 & x$hr < 19
  daytime <- NA_run(x[dt,], 4)
  nighttime <- NA_run(x[!dt,], 3)

  if(any(daytime, nighttime)) NULL else x
}

> ddply(A, .(day), dropfun)
   day hr           v
1    2  0          NA
2    2  1          NA
3    2  2  2.54899107
4    2  3          NA
5    2  4 -0.03476039
6    2  5          NA
7    2  6  0.65658846
8    2  7  0.95949406
9    2  8          NA
10   2  9  1.08444118
11   2 10  0.95949406
12   2 11          NA
13   2 12 -1.80603126
14   2 13          NA
15   2 14          NA
16   2 15  0.97291675
17   2 16          NA
18   2 17          NA
19   2 18          NA
20   2 19 -0.29429386
21   2 20  0.87820363
22   2 21          NA
23   2 22  0.56305582
24   2 23 -0.11028549
>