如何在ifelse语句中忽略NA

Ada*_*NYC 9 r conditional-statements

我从SAS来到R,数字缺失设置为无穷大.所以我们可以说:

positiveA = A > 0;
Run Code Online (Sandbox Code Playgroud)

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

positiveA <- ifelse(is.na(A),0, ifelse(A > 0, 1, 0))
Run Code Online (Sandbox Code Playgroud)

我发现这种语法很难阅读.无论如何我可以修改ifelse函数来考虑NA是一个特殊值,对于所有比较条件总是假的吗?如果没有,考虑NA作为-Inf也会起作用.

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

谢谢.

Jos*_*ien 15

此语法更易于阅读:

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

(x > 0) & (!is.na(x)) 
# [1] FALSE  TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

(外括号不是必需的,但除了机器之外几乎任何人都会更容易阅读.)


编辑:

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

最后,你可以把整个事情变成一个函数:

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

isPos(x)
# [1] 0 1 0 0
Run Code Online (Sandbox Code Playgroud)


mne*_*nel 8

NA用零替换值似乎是一种奇怪的行为.R认为NA值丢失(尽管远远落后于您(从不)需要去的场景,当数字时它们是负的非常大的数字))

您需要做的就是A>0或者as.numeric(A>0)如果您想要0,1不是TRUE,FALSE

# 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
Run Code Online (Sandbox Code Playgroud)

请注意, ifelse(A>0, 1,0)这也可行.

这些NA值被"保留"或适当处理.R在这里是明智的.

  • 将有比嵌套ifelse语句更好的方法. (2认同)