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

时间:2017-01-02 15:32:18

标签: r sliding-window

我拥有的数据样本 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'(第6/16)中找到1的值 2.查看“雨”中的3行和5行的值(在这种情况下为1:9/11:19),在var'csum'的第1步确定的位置左右,
3.如果它们的总和> = 0.1; var'小时'(6:8)中前3个值的前三个值被转换为0,在第二种情况下它们保持不变,因为sum为0。

预期输出:df1 $小时中前三个值1切换为0

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

1 个答案:

答案 0 :(得分: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
相关问题