【问题标题】:if_else true value defaulting to NA [duplicate]if_else true 值默认为 NA [重复]
【发布时间】:2019-03-19 15:34:22
【问题描述】:

我正在尝试使用 dplyr 的 if_else 语句改变我的 data_frame 中的新列。但是,如果 TRUE 默认为 NA,我分配给向量的值,而 FALSE 值似乎正在工作。我不确定它是否与变量类型或什么有关,但我非常感谢您对此的帮助。

我的数据

data <- 
 data.frame(SP = c("A","B","C","D","E"),
            Sale = c("Y","Y",NA,"Y",NA),
            WWS = c(NA,NA,"Y",NA,"Y"))

添加新列的现有代码

data %>%
  mutate(RMV = if_else(
               Sale == "Y" & WWS != "Y", "Keep","-"))

当我运行上面的代码时,所有的 TRUE 值都默认为 NA,而不是 Keep。

【问题讨论】:

  • 我们无法比较 NA 值,请尝试:NA == 1NA == NA 等。
  • data %&gt;% mutate(RMV = dplyr::if_else( ( !is.na( Sale ) &amp; Sale == "Y" ) &amp; ( WWS != "Y" | is.na( WWS ) ) , "Keep", "-" ) )

标签: r dplyr plyr


【解决方案1】:

你想要这样的东西吗:

data %>%
  mutate(RMV = (Sale == "Y" & !is.na(Sale)) & (WWS != "Y" | is.na(WWS)))

  SP Sale  WWS   RMV
1  A    Y <NA>  TRUE
2  B    Y <NA>  TRUE
3  C <NA>    Y FALSE
4  D    Y <NA>  TRUE
5  E <NA>    Y FALSE

?Comparison 的帮助中解释了您最初尝试的问题:

缺失值 (NA) 和 NaN 值即使与它们自身也被视为不可比较,因此涉及它们的比较总是会导致 NA。

基本上意味着您不能使用任何比较运算符来比较 NA。所以使用以下任何一种:

x < y
x > y
x <= y
x >= y
x == y
x != y

...如果上面的任何一个(或两个!)x 或 y 是 NA,它总是会导致 NA。

【讨论】:

  • 您可以使用is.na() 来检查 NA 的...
  • @Wimpel 绝对正确,谢谢!我现在根据您的评论进行了编辑以涵盖更多案例。即,OP 的数据样本没有 Sales 为 NA 且 WWS !='Y' 的情况。然而,最佳实践要求我们应该通过测试 !is.na(Sales) 来处理这种情况,正如 Wimpel 非常友好地建议的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 2021-03-17
相关资源
最近更新 更多