问题描述
我不是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"
))))
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")
。