10

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

positiveA = A > 0;

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

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

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

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

谢谢。

4

5 回答 5

16

此语法更易于阅读:

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
于 2012-11-28T05:50:06.443 回答
10

用零替换一个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

请注意, ifelse(A>0, 1,0)这也可以。

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

于 2012-11-28T05:44:49.247 回答
2

试试这个:

positiveA <- ifelse(!is.na(A) & A > 0, 1, 0)
于 2014-05-02T08:11:54.680 回答
1

您可以使用缺少的参数 iif_else_来自hablar

library(hablar) 

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

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

这给了你

[1] FALSE  TRUE FALSE FALSE
于 2019-06-10T21:07:24.877 回答
0

如果您正在使用整数,则可以使用 %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
于 2017-04-04T23:41:18.563 回答