Ifelse语句链,用于基于其他列的某些条件创建新列

时间:2019-09-04 12:53:48

标签: r dataframe if-statement

我的参与者被问到一个问题(cle1i2),可能的答案是(1)或否(0)。

在这些回答为“是”的人中,再次被问到另一个问题(cle2i2),可能的答案是(1)或否(0)。

现在,在R中,我想创建一个新列(cle7_P),其中的值取决于以下条件。

条件就是这些条件,应该一起执行;

  1. 如果cle1i2是NA而cle2i2是NA,那么cle7_P是NA;

  2. 如果cle1i2为0且cle2i2为NA,则cle7_P为0;

  3. 如果cle1i2为1且cle2i2为1,则cle7_P为1;

  4. 如果cle1i2为1且cle2i2为0,则cle7_P为0;

  5. 如果cle1i2为1且cle2i2为NA,则cle7_P为NA;

这是我到目前为止尝试过的方法,但是当我手动检查数据时它不起作用。

library(dplyr)
library(tidyverse)

h$pcle7_P %>% 
  (ifelse(is.na( cle1i2) & is.na( cle2i2), 
       yes = NA, 
       no = ifelse( cle1i2 == 0 & is.na( cle2i2), 
          yes = 0, 
          no = ifelse( cle1i2 == 1 & cle2i2 == 1, 
              yes = 1, 
              no = ifelse( cle1i2 == 1 & cle2i2 == 0, 
                  yes = 0, 
                  no = ifelse( cle1i2 == 1 & is.na(cle2i2), 
                      NA))))))



h <- h %>%
  mutate( pcle7_P = ifelse(cle1i2 == NA | cle2i2 == NA, 
    yes = NA, 
    no = ifelse(cle1i2 == 0 | cle2i2 == NA, 
        yes =0, 
        no = ifelse(cle1i2 == 1 | cle2i2 == 1, 
            yes = 1, 
            no = ifelse(cle1i2 == 1 | cle2i2 == 0, 
                yes = 0, 
                no = ifelse(cle1i2 == 1 | cle2i2 == NA), 
                    NA)))))

我希望有一个新列具有根据条件的值。

你能帮我吗?谢谢

2 个答案:

答案 0 :(得分:2)

您可以尝试case_when,它非常适合多个ifelse

library(tidyverse)
h %>% 
  mutate(pcle7_P = case_when(is.na(cle1i2) & is.na(cle2i2) ~ NA_real_,
                             cle1i2 == 0 ~ 0,
                             cle1i2 == 1 & cle2i2 == 1 ~ 1,
                             cle1i2 == 1 & cle2i2 == 0 ~ 0, 
                             cle1i2 == 1 & is.na(cle2i2) == 1 ~ NA_real_))

答案 1 :(得分:0)

您的第二次尝试可能有效,但请记住

> NA == NA
[1] NA

您需要像第一次尝试一样使用is.na(cle1i2)