具有多个条件和NA的ifelse语句

时间:2019-12-05 09:06:59

标签: r if-statement

我试图基于逻辑语句为另一列的值创建一列“完成”。该列名为“ etc001_processed”,其中包含一个人完成的测试数。很多人根本没有完成“ etc001”测试,因此有很多NA。我想要创建“完成”列:

    如果etc001_processed是NA,则
  1. 是NA
  2. 如果etc001_processed为12,则
  3. 为1
  4. 如果etc001_processed不是12或NA,
  5. 为0
> print(dat_de$etc001_processed)
 [1] NA NA NA NA 12 NA NA NA NA NA NA 12 NA  9 NA 12  7 NA 12 NA NA NA NA NA NA NA NA NA NA NA NA NA NA 12 12 NA NA NA 12 NA NA NA NA
[44] 12 12 NA 12 NA 12 NA NA 12 12 NA 12 NA 12 NA NA 12

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以通过分别ifelse嵌套case_whendplyr来指定每个条件,但是在这种情况下,您可以直接执行

dat_de$complete <- as.integer(dat_de$etc001_processed == 12)
dat_de

#   temp etc001_processed complete
#1     1               NA       NA
#2     2               NA       NA
#3     3               NA       NA
#4     4               NA       NA
#5     5               12        1
#6     6               NA       NA
#7     7               NA       NA
#8     8               NA       NA
#9     9               NA       NA
#10   10               NA       NA
#11   11               12        1
#12   12               NA       NA
#13   13                9        0
#14   14               NA       NA
#15   15               12        1
#16   16                7        0

数据

dat_de <- data.frame(temp = 1:16, etc001_processed =  c(NA, NA, NA, NA, 12, 
                     NA, NA, NA, NA, NA,12, NA,  9 ,NA, 12,  7))

答案 1 :(得分:0)

如果您想使用if-else语句,我想推荐ifelse(),即

df <- within(df, complete <- ifelse(etc001_processed==12,1,
                                    ifelse(is.na(etc001_processed),NA,0)))

带有虚拟数据的示例

df <- data.frame(etc001_processed =  c(NA, 3, NA, NA, 12, NA, 5, NA, 6, NA,12, NA,  8 ,9, NA,  1))

df <- within(df, complete <- ifelse(etc001_processed==12,1,
                                    ifelse(is.na(etc001_processed),NA,0)))

给出

> df
   etc001_processed complete
1                NA       NA
2                 3        0
3                NA       NA
4                NA       NA
5                12        1
6                NA       NA
7                 5        0
8                NA       NA
9                 6        0
10               NA       NA
11               12        1
12               NA       NA
13                8        0
14                9        0
15               NA       NA
16                1        0