嵌套ifelse函数中的AND运算符

问题描述

我不是R的高级用户,但通常我迟早会找到所需的帮助。 好吧,这次不是。 我有一个名为“ df”的数据框,我试图创建一个额外的列“ Sel”,用于在其中存储基于其他列信息的信息。 为此,我使用了一个嵌套的ifelse函数,下面是我使用的代码,它适用于前两个条件,但不适用于使用AND运算符的后两个条件。 在将用法与其他示例进行比较时,我没有看到任何区别,并且也没有错误,仅粘贴/打印了与该条件相关的语句。 (我也尝试过&&)。 我究竟做错了什么?预先感谢您的帮助!

df <- data.frame(
  Gene = c("A","B","C","D","E"),P_a = c(NA,NA,21010,14941,12),E_a = c(NA,"miss_b",NA),P_b = c(1,200,32,21),E_b = c(NA,"miss_a","miss_a"),Eq = c("no","yes",NA )
  )
df$Sel <- ifelse(
  (df$Eq == "no"),"same",ifelse((df$Eq == "yes"),"diff",ifelse (df$E_a == "miss_b" & 
                 df$E_b == "miss_a","G_P",ifelse(is.na(df$P_b & df$E_b &
                                df$Eq),"in","out"
                                                      ))))

这是我希望通过代码生成的result_df

df_result <- data.frame(
  Gene = c("A",NA ),Sel = c("same","out")
)

解决方法

这是您修改的代码。

df$Sel <- ifelse(
  (df$Eq %in% "no"),"same",ifelse((df$Eq %in% "yes"),"diff",ifelse (df$E_a %in% "miss_b" & 
                   df$E_b %in% "miss_a","G_P",ifelse(is.na(df$P_b) & is.na(df$E_b) &
                                is.na(df$Eq),"in","out"
                 ))))


df$Sel 
[1] "same" "diff" "G_P"  "in"   "out" 

第一个问题是使用==。只要您的数据中没有NA,==就可以正常工作。但是,如果将NA==一起使用,您将得到一个NA-结果不是所需的FALSE或TRUE。并且ifelse需要逻辑(FALSE,TRUE)的其他方式,否则您只会得到NA。就像您提到的那样,这发生在您的第三行。

您可以以ifelse(3 == NA,1,2)为例进行尝试。您可能期望2作为输出,因为2不是NA。但是您会得到NA作为输出。

使用==代替%in%

第二个问题在is.na(df$P_b & df$E_b & df$Eq)中。您一次只能在is.na()中放入一个变量。因此,每个变量都需要一个自己的is.na函数-ifelse(is.na(df$P_b) & is.na(df$E_b) & is.na(df$Eq),"out")