逻辑基于其他向量中下方和上方的行

logical based on rows below and above in other vector

我有一个数据样本。
hour <- c(rep(0,5), rep(1,5),rep(0,5), rep(1,5)) rain <- c(rep(0.1,10),rep(0.0,10)) df1<-data.frame(rain,hour) df1$csum <- with(df1, ave(df1$hour, cumsum(df1$hour == 0), FUN = cumsum))

步骤:
1. 在 'csum' (6th/16th).
中找到 1 的值 2. 查看 'rain' 中向上 3 行和向下 5 行的值(在本例中为 1:9/11:19),围绕由 var 'csum',
中的第一步确定的位置 3. 如果它们的总和 >= 0.1;比 var 'hour' (6:8) 中 1 的前三个值转换为 0,在第二种情况下它们保持不变,因为总和为 0。

预期输出:df1$hour 中 1 的前三个值被切换为 0

hour = c(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1)

这个解决方案可能会有很多改进:

x = which(df1$csum == 1)

func <- function(i) {
  lower_lim = i-5 # out-of-bound errors can happen, prefer max(1, (i-5))
  upper_lim = i+3 #  prefer min(1, (i+3))
  if (sum(df1$rain[lower_lim:upper_lim]) >= 0.1){
    y <- df1$hour[lower_lim:upper_lim]
    y[which(y == 1)[1:3]] = 0
    df1$hour[lower_lim:upper_lim] <- y
  }
  assign("df1", df1, envir = .GlobalEnv)
}

sapply(x, func)

# df1
#   rain hour csum
#1   0.1    0    0
#2   0.1    0    0
#3   0.1    0    0
#4   0.1    0    0
#5   0.1    0    0
#6   0.1    0    1
#7   0.1    0    2
#8   0.1    0    3
#9   0.1    1    4
#10  0.1    1    5
#11  0.0    0    0
#12  0.0    0    0
#13  0.0    0    0
#14  0.0    0    0
#15  0.0    0    0
#16  0.0    1    1
#17  0.0    1    2
#18  0.0    1    3
#19  0.0    1    4
#20  0.0    1    5