每行、每组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