我有一系列逻辑数据。我试图找到时间(a)当时的逻辑是错误的; (b)前三个时期的逻辑是错误的; (c)以下两个期间的逻辑是假的。例如,在以下数据框中,只有时间5符合标准。
example <- structure(list(time = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), raining = c(TRUE,
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE)), .Names = c("time",
"raining"), row.names = c(NA, -10L), class = "data.frame")
我可以使用过滤器轻松检查当前时间和前三个
example$filtered <- filter(example[,"raining"], c(1,1,1,1), sides = 1) == 0
但我无法弄清楚如何让它也向前看。也许使用sides = 2和不同的滤镜组?任何帮助表示赞赏。
答案 0 :(得分:3)
我认为您可以通过查找前面有6个点等于0的点来重新表达问题,然后从索引中取出2来获得所需的结果。
000 0 00 <---> 00000 0
--- _ ++ ----- _
这是使用zoo
包的解决方案:
library(zoo)
dt = zoo(example$raining,order.by=example$time)
res <- rollsumr(dt, 6) ## as commented below
index(res[res==0])-2
[1] 5
使用filter
即可:
filter(example[,"raining"], rep(1,6), sides = 1)==0
答案 1 :(得分:2)
您可以使用包lead
lag
和dplyr
创建向量的偏移版本
library(dplyr)
m <- cbind(sapply(3:1, function(x) lag(rain, x)), # preceeding three
rain, # current
sapply(1:2, function(x) lead(rain, x))) # following two
# find row with all FALSE
which(rowSums(m, na.rm = TRUE) == 0)
# [1] 5