R中嵌套的ifelse语句中缺少值

roo*_*ody 1 if-statement r

在某个时间点,我遇到了这个问题......并解决了它.然而,由于这是一个反复出现的问题,我现在已经忘记了解决方案,希望这个问题能够为其他人以及我提供澄清:)

我正在创建一个基于几个问题的答案的变量.每个问题可以有三个值:1,2或NA.对于每次观察,1和2是互斥的.

我只是想创建一个变量,它是每个人用"1"编码的选择的组合,并根据该代码给它一个值.

所以让我说我有这个df:

ID   var1    var2   var3   var4
1    1       2      NA     NA
2    NA      NA     2      1
3    2       1      NA     NA
4    2       NA     1      NA
Run Code Online (Sandbox Code Playgroud)

然后我尝试根据以下语句重新编码:

df$var <- 
    ifelse(
        as.numeric(df$var1) == 1,
        "Gut instinct",
        ifelse(
            as.numeric(df$var2) == 1,
            "Data",
            ifelse(
                as.numeric(df$var3) == 1,
                "Science",
                ifelse(
                    as.numeric(df$var4) == 1,
                    "Philosophy",
                    NA
                )
            )
        )
    )
Run Code Online (Sandbox Code Playgroud)

但是,此代码仅基于"ifelse"的PARTIALLY代码.例如,df$var可能会观察到"肠道本能"和"哲学",但是当时var2和var3==1仍然是NA 的编码.

有关为什么会发生这种情况的任何想法?

the*_*ail 5

一个比apply(使用@ MrFlick的数据)更快的替代方案:

vals <- c("Gut", "Data", "Science", "Phil")
intm <- dd[-1]==1 & !is.na(dd[-1])
dd$resp <- NA
dd$resp[row(intm)[intm]] <- vals[col(intm)[intm]]
Run Code Online (Sandbox Code Playgroud)

多快多少?在100万行:

#row/col assignment
user  system elapsed 
0.99    0.02    1.02 

#apply
 user  system elapsed 
11.98    0.04   12.30 
Run Code Online (Sandbox Code Playgroud)

尝试使用相同的数据集时,会得到相同的结果:

identical(flick$resp,latemail$resp)
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)