【问题标题】:Conditional check per row, per group R每行,每组的条件检查 R
【发布时间】:2020-12-21 02:05:23
【问题描述】:

如果x 的值低于y 的值,我正在尝试检查每个组week。每个组只需要检查该组中所有行的第一个值x,它在z 中为TRUE,过去几天除外。此外,一旦目标值 expected 为 TRUE,则无需进一步检查 week。 (如果此标准导致代码额外复杂,也可以继续检查该周)。

数据集:

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))
   date_daily x y     z week
1  2020-01-01 4 3 FALSE    1
2  2020-01-02 5 4  TRUE    1
3  2020-01-03 5 6  TRUE    1
4  2020-01-04 7 6 FALSE    1
5  2020-01-05 7 5  TRUE    1
6  2020-01-06 8 5 FALSE    1
7  2020-01-07 6 5 FALSE    1
8  2020-01-08 3 2 FALSE    2
9  2020-01-09 4 3  TRUE    2
10 2020-01-10 4 4  TRUE    2
11 2020-01-11 5 5  TRUE    2
12 2020-01-12 5 7 FALSE    2
13 2020-01-13 6 5  TRUE    2
14 2020-01-14 3 2 FALSE    2

我尝试将for loop 作为解决方案,但在星期组方面遇到了问题(将针对所有行运行)。预期结果:

df$expected <- c(NA, FALSE, TRUE, NA, NA, NA, NA, NA, FALSE, FALSE, TRUE, NA, NA, 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

【问题讨论】:

    标签: r for-loop conditional-statements


    【解决方案1】:

    一个选项是

    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
    

    【讨论】:

    • 谢谢,如果在“一周”内,“预期”每天都是“假”,我只想保留“星期”最后一个“日期每日”的“假”。那一周之前的'FALSE'应该变成NA。我应该如何处理? (我对 seq_len 函数没有经验)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多