【问题标题】:case_when breaks in multiple conditionscase_when 在多个条件下中断
【发布时间】:2021-07-21 21:50:01
【问题描述】:

我有具有针对Var 的ID 和var LagVar 的滞后变量的示例数据框。

sd <- read.table(header = T, text = "ID Var LagVar
A 1 NA
A 2 1
A 4 2
A 6 4
")

我正在检查 LagVar 是否与 Var 或 (Var -1) 相同。它对最后 2 行返回 FALSE。

我希望 Flag 将前 2 行设置为 FALSE,将后 2 行设置为 TRUE。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    问题在于语句的顺序以及%in% 的一般属性,它确实检查列中的所有值或使用c 创建的向量,因此将所有TRUE 作为这些值返回' LagVar' 存在于 'Var' 列中

    library(dplyr)
    sd %>%
         mutate(Flag = ((LagVar %in% c(Var, Var - 1)) | (Var == 1)))
    

    -输出

    ID Var LagVar Flag
    1 P2   1     NA TRUE
    2 P2   2      1 TRUE
    3 P2   4      2 TRUE
    4 P2   6      4 TRUE
    

    返回所有TRUE,因此它只检查那个而不是进入下一个

    如果我们用一个简单的例子

    v1 <- 1:5
    case_when(v1 <= 5 ~ FALSE, TRUE ~ TRUE)
    [1] FALSE FALSE FALSE FALSE FALSE
    

    第一个条件返回所有TRUE,因此它不会执行下一个条件。 ~ 是根据条件而不是条件本身来分配值。如果我们要执行下一个条件,第一个应该返回 FALSE 而不是赋值

    case_when(v1 > 5~  FALSE, TRUE ~ TRUE)
    [[1] TRUE TRUE TRUE TRUE TRUE
    

    实际条件和返回值之间存在混淆,因为两者都是合乎逻辑的


    当我们执行%in% 时,它会检查所有行,除非分组。我们可以添加rowwise 属性来防止检查所有行

    sd %>% 
        rowwise %>% 
        mutate(Flag = !(LagVar %in% c(Var, Var-1)|(Var == 1))) %>%
        ungroup
    # A tibble: 4 x 4
      ID      Var LagVar Flag 
      <chr> <int>  <int> <lgl>
    1 P2        1     NA FALSE
    2 P2        2      1 FALSE
    3 P2        4      2 TRUE 
    4 P2        6      4 TRUE 
    

    或者我们可能需要使用==| 再添加一个条件,因为== 进行元素比较

    sd %>%
        mutate(Flag = !(LagVar == Var| LagVar == (Var - 1)|(Var == 1)))
    ID Var LagVar  Flag
    1 P2   1     NA FALSE
    2 P2   2      1 FALSE
    3 P2   4      2  TRUE
    4 P2   6      4  TRUE
    

    【讨论】:

    • 谢谢。我希望 Flag 为前 2 行设置 FALSE,为最后 2 行设置 TRUE。例如: LagVar= 2 和 Var=4, (2 %in% c(4, 4 - 1)) | (4 == 1)
    • @UjjawalBhandari 如何在 c(var, var-1) 中出现第二行 FALSE 1`
    • 非常感谢。这很有帮助。 “当我们执行 %in% 时,它会检查所有行,除非分组。” - 如果我在变异前使用 groupby(ID),%in% 不应该工作吗?
    • @UjjawalBhandari 仍然无法工作,因为每个组有多行,并且您希望对每一行都执行此操作
    • @UjjawalBhandari 或者你想要sd %&gt;% mutate(Flag = !(LagVar == Var| LagVar == (Var - 1)|(Var == 1)))
    猜你喜欢
    • 2021-09-17
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2020-01-27
    相关资源
    最近更新 更多