每行、每组R的条件检查

每行、每组R的条件检查,r,for-loop,conditional-statements,R,For Loop,Conditional Statements,我试图检查每个组周的x值是否低于y。对于每个组,除过去几天外,只需检查该组中所有行的第一个值x,该值在z中为真。此外,一旦目标值预期值为真,则无需进一步检查该周。(如果该准则导致代码中的额外复杂性,则可以在该周继续检查) 数据集: date_daily <- seq(as.Date("2020-01-01"), as.Date("2020-01-14"), by="days") x <- c(4, 5, 5, 7, 7, 8

我试图检查每个组
x
值是否低于
y
。对于每个组,除过去几天外,只需检查该组中所有行的第一个值
x
,该值在
z
中为真。此外,一旦目标值
预期值
为真,则无需进一步检查该
。(如果该准则导致代码中的额外复杂性,则可以在该周继续检查)

数据集:

date_daily <- seq(as.Date("2020-01-01"), as.Date("2020-01-14"), by="days")
x <- c(4, 5, 5, 7, 7, 8, 6, 3, 4, 4, 5, 5, 6, 3)
y <- c(3, 4, 6, 6, 5, 5, 5, 2, 3, 4, 5, 7, 5, 2)
z <- c( FALSE,  TRUE ,  TRUE ,  FALSE ,  TRUE ,  FALSE ,  FALSE ,  FALSE ,  TRUE ,  TRUE ,  TRUE ,  
FALSE ,  TRUE ,  FALSE )
df <- data.frame(date_daily, x, y, z)
df$week <-  week(ymd(df$date_daily))
我尝试了
for loop
作为解决方案,但周组出现问题(将针对所有行运行)。预期成果:

df$expected <- c(NA, FALSE, TRUE, NA, NA, NA, NA, NA, FALSE, FALSE, TRUE, NA, NA, NA)
一个选择是

library(data.table)
setDT(df)[z, expected := cumsum(cumsum(x[z][1] < y)) == 1, week]
i1 <- df[, .I[seq_len(.N) > which(expected)], week]$V1
df[i1, expected := NA]
df
#    date_daily x y     z week expected
# 1: 2020-01-01 4 3 FALSE    1       NA
# 2: 2020-01-02 5 4  TRUE    1    FALSE
# 3: 2020-01-03 5 6  TRUE    1     TRUE
# 4: 2020-01-04 7 6 FALSE    1       NA
# 5: 2020-01-05 7 5  TRUE    1       NA
# 6: 2020-01-06 8 5 FALSE    1       NA
# 7: 2020-01-07 6 5 FALSE    1       NA
# 8: 2020-01-08 3 2 FALSE    2       NA
# 9: 2020-01-09 4 3  TRUE    2    FALSE
#10: 2020-01-10 4 4  TRUE    2    FALSE
#11: 2020-01-11 5 5  TRUE    2     TRUE
#12: 2020-01-12 5 7 FALSE    2       NA
#13: 2020-01-13 6 5  TRUE    2       NA
#14: 2020-01-14 3 2 FALSE    2       NA
库(data.table)
setDT(df)[z,预期值:=cumsum(cumsum(x[z][1]
谢谢,如果在“一周”内,“预期”是每天的“假”,我只想保留“一周”最后一个“日期”的“假”。该周前一个“假”应该变成NA。我应该怎么做?(我在序列功能方面没有经验)。
   date_daily x y     z week expected
1  2020-01-01 4 3 FALSE    1       NA
2  2020-01-02 5 4  TRUE    1    FALSE
3  2020-01-03 5 6  TRUE    1     TRUE
4  2020-01-04 7 6 FALSE    1       NA
5  2020-01-05 7 5  TRUE    1       NA
6  2020-01-06 8 5 FALSE    1       NA
7  2020-01-07 6 5 FALSE    1       NA
8  2020-01-08 3 2 FALSE    2       NA
9  2020-01-09 4 3  TRUE    2    FALSE
10 2020-01-10 4 4  TRUE    2    FALSE
11 2020-01-11 5 5  TRUE    2     TRUE
12 2020-01-12 5 7 FALSE    2       NA
13 2020-01-13 6 5  TRUE    2       NA
14 2020-01-14 3 2 FALSE    2       NA
library(data.table)
setDT(df)[z, expected := cumsum(cumsum(x[z][1] < y)) == 1, week]
i1 <- df[, .I[seq_len(.N) > which(expected)], week]$V1
df[i1, expected := NA]
df
#    date_daily x y     z week expected
# 1: 2020-01-01 4 3 FALSE    1       NA
# 2: 2020-01-02 5 4  TRUE    1    FALSE
# 3: 2020-01-03 5 6  TRUE    1     TRUE
# 4: 2020-01-04 7 6 FALSE    1       NA
# 5: 2020-01-05 7 5  TRUE    1       NA
# 6: 2020-01-06 8 5 FALSE    1       NA
# 7: 2020-01-07 6 5 FALSE    1       NA
# 8: 2020-01-08 3 2 FALSE    2       NA
# 9: 2020-01-09 4 3  TRUE    2    FALSE
#10: 2020-01-10 4 4  TRUE    2    FALSE
#11: 2020-01-11 5 5  TRUE    2     TRUE
#12: 2020-01-12 5 7 FALSE    2       NA
#13: 2020-01-13 6 5  TRUE    2       NA
#14: 2020-01-14 3 2 FALSE    2       NA