使用 case_when 时如何解决此错误?

How can I solve this error when using case_when?

我正在使用此代码:

ovabonnement <- ovabonnement %>%
  mutate(c12_ovabonnement_type_con_voor = case_when(s2_ovabonnement_type_voor_anders == 1 ~ NA,
                                                    s2_ovabonnement_type_voor_1 == 1 |
                                                      s2_ovabonnement_type_voor_13 == 1 ~ "Basis",
                                                    s2_ovabonnement_type_voor_2 == 1 | 
                                                      s2_ovabonnement_type_voor_3 == 1 |
                                                      s2_ovabonnement_type_voor_4 == 1 |
                                                      s2_ovabonnement_type_voor_9 == 1 |
                                                      s2_ovabonnement_type_voor_11 == 1 ~ "Voordeel",
                                                    s2_ovabonnement_type_voor_5 == 1 |
                                                      s2_ovabonnement_type_voor_6 == 1 |
                                                      s2_ovabonnement_type_voor_7 == 1 |
                                                      s2_ovabonnement_type_voor_8 == 1 |
                                                      s2_ovabonnement_type_voor_10 == 1 |
                                                      s2_ovabonnement_type_voor_12 == 1 |
                                                      s2_ovabonnement_type_voor_14 == 1 ~ "Vrij"))

所以我有这 15 个变量来表示一个人是否已将订阅添加到他们的 public 交通会员资格中。因为这是一个多项选择问卷,人们可以 select 多项选择,这就是为什么它们是不同的变量。

我想把这些变成一个变量,如果人们回答“其他”,则取 NA,如果人们回答 1 或 13,则取“基础”,如果人们回答 2、3、4、9 或 11,则取“Voordeel”,以及“ Vrij" 如果人们回答 5、6、7、8、10、12 或 14。

如果人们回答 2,s2_ovabonnement_type_voor_2 中就会有一个 1。人们可能已经回答了其中的多个问题,这使得它有点棘手。但是,我希望它按时间顺序进行。例如,如果一个人回答 2 AND 10,它应该选择 10,因为代码在后面,但我不确定 case_when 是否是这样工作的。

我收到这个错误:

Error in `mutate()`:
! Problem while computing `c12_ovabonnement_type_con_voor = case_when(...)`.
Caused by error in `names(message) <- `*vtmp*``:
! 'names' attribute [1] must be the same length as the vector [0]
Run `rlang::last_error()` to see where the error occurred.

case_when/if_else 是类型敏感的,即所有表达式都应该 return 相同的类型。在 OP 的表达式中,第一个表达式 returns NA 和 NA 默认为 logical,其他所有 return character 类型。我们需要NA_character_来匹配others

的类型
ovabonnement <- ovabonnement %>%
  mutate(c12_ovabonnement_type_con_voor = case_when(s2_ovabonnement_type_voor_anders == 1 ~ NA_character_,
                                                    s2_ovabonnement_type_voor_1 == 1 |
                                                      s2_ovabonnement_type_voor_13 == 1 ~ "Basis",
                                                    s2_ovabonnement_type_voor_2 == 1 | 
                                                      s2_ovabonnement_type_voor_3 == 1 |
                                                      s2_ovabonnement_type_voor_4 == 1 |
                                                      s2_ovabonnement_type_voor_9 == 1 |
                                                      s2_ovabonnement_type_voor_11 == 1 ~ "Voordeel",
                                                    s2_ovabonnement_type_voor_5 == 1 |
                                                      s2_ovabonnement_type_voor_6 == 1 |
                                                      s2_ovabonnement_type_voor_7 == 1 |
                                                      s2_ovabonnement_type_voor_8 == 1 |
                                                      s2_ovabonnement_type_voor_10 == 1 |
                                                      s2_ovabonnement_type_voor_12 == 1 |
                                                      s2_ovabonnement_type_voor_14 == 1 ~ "Vrij"))