【问题标题】:AND operator in nested ifelse function嵌套 ifelse 函数中的 AND 运算符
【发布时间】:2020-09-23 19:31:03
【问题描述】:

我不是高级 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, NA, "miss_b", "miss_b",NA),
  P_b = c(1,200,32,NA,21),
  E_b = c(NA, NA, "miss_a", NA,"miss_a"),
  Eq = c("no", "yes", NA, NA,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","B","C","D","E"),
  P_a = c(NA, NA, 21010, 14941,12),
  E_a = c(NA, NA, "miss_b", "miss_b",NA),
  P_b = c(1,200,32,NA,21),
  E_b = c(NA, NA, "miss_a", NA,"miss_a"),
  Eq = c("no", "yes", NA, NA, NA ),
  Sel = c("same","diff", "G_P","in", "out")
)

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。请不要发布数据图片,因为我们无法复制/粘贴这些值进行测试。
  • 我知道你是完全正确的。我会执行的。

标签: r if-statement logical-operators


【解决方案1】:

这是您修改后的代码。

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 &amp; df$E_b &amp; df$Eq)。在is.na() 中一次只能放置一个变量。因此,每个变量都需要一个自己的 is.nafunction - ifelse(is.na(df$P_b) &amp; is.na(df$E_b) &amp; is.na(df$Eq),"in","out")

【讨论】:

  • 这太完美了!感谢您对代码的修改和详尽的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2016-08-23
相关资源
最近更新 更多