【问题标题】:Error in `case_when` condition, but the error message isn't helpful in figuring out what's going on`case_when` 条件错误,但错误消息无助于弄清楚发生了什么
【发布时间】:2022-11-24 16:33:00
【问题描述】:

我不知道在这个看似非常基本的重新编码示例中发生了什么:

library(dplyr)
df = data.frame(hcat = 1:5,
                Q12  = 41:45)

df |> 
  mutate(Q12_test = case_when(hcat <= 3 & Q12 == 41 ~ 40,
                              hcat == 5 & Q12 == 42 ~ 41,
                              hcat == 5 & Q12 == 43 ~ 42,
                              TRUE ~ Q12))

这看起来像是我使用了数百次的标准 case_when 条件,但由于我不明白的原因,它出错了:

<error/dplyr:::mutate_error>
Error in `mutate()`:
! Problem while computing `Q12_test = case_when(...)`.
Caused by error in `case_when()`:

---
Backtrace:
 1. dplyr::mutate(...)
 6. dplyr::case_when(...)

我在这里错过了什么?

注意:我还尝试更改一些代码部分(例如,删除额外的热量条件或第三个条件),但没有任何效果。

更新:好的,罪魁祸首似乎是底部的“全部捕获”条件,即TRUE ~ Q12。如果我把它拿出来,它就会起作用。现在,问题是我怎么能把它留在里面,因为我不想将它们重新编码为 NA,而是只保留原始的 Q12 值。

更新 2:好的,下面的代码可以工作,但我真的不知道,为什么我需要将它包装成一个as.numeric

df |> 
  mutate(Q12_test = case_when(hcat <= 3 & Q12 == 41 ~ 40,
                              hcat == 5 & Q12 == 42 ~ 41,
                              hcat == 5 & Q12 == 43 ~ 42,
                              TRUE ~ as.numeric(Q12)))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这是因为numericinteger的混合类型。

    case_when 对数据类型非常敏感,所以你必须让变量的类型相同。

    > str(df$Q12)
     int [1:5] 41 42 43 44 45
    > str(42)
     num 42
    > str(42L)
     int 42
    

    您可以使用 L 来生成结果 integer

    df %>% 
      mutate(Q12_test = case_when((hcat <= 3 & Q12 == 41) ~ 40L,
                                  (hcat == 5 & Q12 == 42) ~ 41L,
                                  (hcat == 5 & Q12 == 43) ~ 42L,
                                  TRUE ~ Q12))
    

    Q12numeric

    df %>%
      mutate(Q12 = as.numeric(Q12)) %>%
      mutate(Q12_test = case_when(hcat <= 3 & Q12 == 41 ~ 40,
                                  hcat == 5 & Q12 == 42 ~ 41,
                                  hcat == 5 & Q12 == 43 ~ 42,
                                  TRUE ~ Q12))
    

    【讨论】:

    • 啊,我明白了,即使没有明确地为 Q 12 创建一个整数向量,R 也把它变成了一个。
    • @deschen 是的。使用case_when 时需要检查它的类型。此外,NA在使用时也需要匹配,如NA_real_NA_character_NA_integer_NA_complex_
    猜你喜欢
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    相关资源
    最近更新 更多