我可以嵌套多个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'语句的解决方法似乎更有效。