在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。结果优选地保持数据帧。请帮忙,谢谢!
答案 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
>