如何在 ifelse 语句中忽略 NA

Posted

技术标签:

【中文标题】如何在 ifelse 语句中忽略 NA【英文标题】:How to ignore NA in ifelse statement 【发布时间】:2012-11-15 22:00:14 【问题描述】:

我从 SAS 来到 R,其中数字缺失设置为无穷大。所以我们只能说:

positiveA = A > 0;

在 R 中,我必须像这样冗长:

positiveA <- ifelse(is.na(A),0, ifelse(A > 0, 1, 0))

我发现这种语法很难阅读。无论如何我可以修改 ifelse 函数以将 NA 视为对于所有比较条件始终为假的特殊值?如果没有,将 NA 视为 -Inf 也可以。

同样,在字符变量的 ifelse 语句中将 NA 设置为 ''(空白)。

谢谢。

【问题讨论】:

正如大家已经说过的:不要将 NA 替换为逻辑值或数值。许多 R 函数都有一个“na.rm=TRUE/FALSE”或类似的参数,以允许您适当地处理您的数据。如果 SAS 真的将事物设置为 Inf,则它们违反了基本的计算机数学规则(更不用说 Inf 是数学表达式的允许结果,如 NaN (= 0/0 ,例如));而 NA 意味着完全不同的东西。一旦你习惯了 R 的哲学,你会更愿意让 NA 保持 NA。 【参考方案1】:

这种语法更容易阅读:

x <- c(NA, 1, 0, -1)

(x > 0) & (!is.na(x)) 
# [1] FALSE  TRUE FALSE FALSE

(外圆括号不是必需的,但会使语句更容易被机器以外的任何人阅读。)


编辑

## If you want 0s and 1s
((x > 0) & (!is.na(x))) * 1
# [1] 0 1 0 0

最后,你可以把整个东西变成一个函数:

isPos <- function(x) 
    (x > 0) & (!is.na(x)) * 1


isPos(x)
# [1] 0 1 0 0

【讨论】:

这很酷,乔希。 positiveA &lt;- ifelse(x &gt; 0 &amp; !is.na(x), 1, 0) 是我能得到的最好的吗? @AdamNYC -- 谢谢。这里真的不需要任何ifelse() 电话。 (见我的编辑。) 我实际上需要将 T/F 转换为 1/0 来聚合它。 (SAS 中的语句给了我 1/0)。有没有更好的方法在 R 中做到这一点(即避免 ifelse)。 *1 很棒!非常感谢 仅供参考,它基于基本算术运算符“[强制逻辑向量]为整数或数字向量,‘FALSE’值为 0,‘TRUE’值为 1。” (引用的文字来自?Arithmetic,也由?* 到达。)也试试sum(c(TRUE, TRUE, FALSE)); TRUE + c(TRUE, FALSE) 等。【参考方案2】:

用零替换NA 值似乎是相当奇怪的行为。 R 认为 NA 缺少值(虽然隐藏在你(永远)不需要去的场景后面很远,但当数字时它们是非常大的负数))

如果你想要 0,1 不是 TRUE , FALSE,你需要做的就是 A&gt;0as.numeric(A&gt;0)

# some dummy data
A <- seq(-1,1,l=11)
# add NA value as second value
A[2] <- NA
positiveA <- A>0
positiveA
 [1] FALSE    NA FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE

 as.numeric(positiveA) # 
 [1]  0 NA  0  0  0  0  1  1  1  1  1

请注意 ifelse(A&gt;0, 1,0) 也可以。

NA 值被“保留”,或被适当处理。 R 在这里是明智的。

【讨论】:

我认为 NA 在 R 中并不是真正的负数:NA 是的,R 是明智的。如果某个东西是NA,那么R 将考虑它NA,但是,在源代码的深处(C 或 FORTRAN,这些 NA 值将是非常大的负值,但除非你在那里闲逛。 在这种情况下,NA 被条件忽略,这就是你想要的,你不希望它用0 替换NA,因为NA 意味着缺失值。 来自data.table -- 我相信 Matthew Dowle,但我认为他已经完成了所需的外观。 会有比嵌套 ifelse 语句更好的方法。【参考方案3】:

试试这个:

positiveA <- ifelse(!is.na(A) & A > 0, 1, 0)

【讨论】:

【参考方案4】:

您可以使用来自hablarif_else_ 缺少的参数:

library(hablar) 

x <- c(NA, 1, 0, -1)

if_else_(x > 0, T, F, missing = F)

给你

[1] FALSE  TRUE FALSE FALSE

【讨论】:

【参考方案5】:

如果您使用整数,则可以使用 %in%

例如,如果你的数字可以上升到 2

test <- c(NA, 2, 1, 0, -1)

其他人建议使用

(test > 0) & (!is.na(test))
or
ifelse(!is.na(test) & test > 0, 1, 0)

我的解决方案更简单,并且给你同样的结果。

test %in% 1:2

【讨论】:

以上是关于如何在 ifelse 语句中忽略 NA的主要内容,如果未能解决你的问题,请参考以下文章

如何在ggplot2中包含忽略NA个案的IF语句

如何将覆盖函数插入到 if else 语句中

如何在 JavaScript 中编写没有“else”的 IF else 语句 [关闭]

如何根据R中的条件创建新变量

嵌套 ifelse 语句

如何使用 JavaScript 中的三元运算符更改函数中的 if else 语句?