了解与NAs的ifelse

时间:2017-06-07 09:54:42

标签: r if-statement na

我可以嵌套多个ifelse语句,如下所示:

ifelse(2==1, "2==1", ifelse(3==1, "3==1", ifelse(1==1, "1==1", NA)))
#[1] "1==1"

然而,好像NAs正在走上正轨。以下内容返回......

df <- data.frame(a = c(1, 1, NA, NA, NA ,NA),
                 b = c(NA, NA, 1, 1, NA, NA),
                 c = c(rep(NA, 4), 1, 1))
ifelse(df$a==1, "a==1", ifelse(df$b==1, "b==1", ifelse(df$c==1, "c==1", NA)))
#[1] "a==1" "a==1" NA     NA     NA     NA    

...而不是所需的

#[1] "a==1" "a==1" "b==1" "b==1"  "c==1" "c==1" 

我可以先为NA分配不同的值以获得所需的结果:

df_noNA <- data.frame(a = c(1, 1, 2, 2, 2 ,2),
                 b = c(2, 2, 1, 1, 2, 2),
                 c = c(rep(2, 4), 1, 1))

ifelse(df_noNA$a==1, "a==1", ifelse(df_noNA$b==1, "b==1", ifelse(df_noNA$c==1, "c==1", NA)))
#[1] "a==1" "a==1" "b==1" "b==1"  "c==1" "c==1" 

但是,我想知道是否有更直接的方法告诉ifelse忽略NAs?

编辑:我正在寻找有效解决此问题的方法。

如@Cath的评论中所述,我可以告诉'Ielse'忽略NAs:

ifelse(df$a==1 &  !is.na(df$a), "a==1", 
    ifelse(df$b==1 & !is.na(df$b), "b==1", 
        ifelse(df$c==1 & !is.na(df$c), "c==1", NA)))

然而,正如@akrun所指出的那样,为每列输入!is.na(x_i)似乎有些冗长(对我而言,指定x应该等于1而不是NA)似乎也是多余的。此时,首先使用数据集中不存在的值(例如,在这种情况下为2)替换NAs然后编写没有!is.na(x_i)的'ifelse'语句的解决方法似乎更有效。

0 个答案:

没有答案