如何在ifelse语句中忽略NA

时间:2012-11-28 05:36:46

标签: r conditional-statements

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

positiveA = A > 0;

在R中,我必须像:

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

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

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

感谢。

5 个答案:

答案 0 :(得分:14)

此语法更易于阅读:

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

答案 1 :(得分:8)

NA值替换为零似乎是一种奇怪的行为。 R认为NA值缺失(虽然远远落后于您(从不)需要去的场景,但是数字时它们是负数非常大的数字))

如果你想要0,1不是真,你需要做的只是A>0as.numeric(A>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>0, 1,0)也可以。

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

答案 2 :(得分:2)

试试这个:

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

答案 3 :(得分:0)

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

例如,如果您的号码最多可以达到2

             V1    V2              V3                     V4
1 24-March-2017 text1 874874455221112       Text text text10
2 25-March-2017 text2        54654656 TEXT      Text text 11
3 24-March-2017 text3 874874455221112      Text text text 12

其他人建议使用

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

我的解决方案更简单,并为您提供相同的结果。

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

答案 4 :(得分:0)

您可以使用if_else_中的丢失参数i hablar

library(hablar) 

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

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

给你

[1] FALSE  TRUE FALSE FALSE