逻辑基于其他向量中下方和上方的行
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
我有一个数据样本。
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