我从 SAS 来到 R,其中数字缺失设置为无穷大。所以我们只能说:
positiveA = A > 0;
在 R 中,我必须像这样冗长:
positiveA <- ifelse(is.na(A),0, ifelse(A > 0, 1, 0))
我发现这种语法很难阅读。无论如何我可以修改 ifelse 函数以将 NA 视为对于所有比较条件始终为假的特殊值?如果没有,将 NA 视为 -Inf 也可以。
同样,在字符变量的 ifelse 语句中将 NA 设置为 ''(空白)。
谢谢。
我从 SAS 来到 R,其中数字缺失设置为无穷大。所以我们只能说:
positiveA = A > 0;
在 R 中,我必须像这样冗长:
positiveA <- ifelse(is.na(A),0, ifelse(A > 0, 1, 0))
我发现这种语法很难阅读。无论如何我可以修改 ifelse 函数以将 NA 视为对于所有比较条件始终为假的特殊值?如果没有,将 NA 视为 -Inf 也可以。
同样,在字符变量的 ifelse 语句中将 NA 设置为 ''(空白)。
谢谢。
此语法更易于阅读:
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
用零替换一个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在这里是明智的。
试试这个:
positiveA <- ifelse(!is.na(A) & A > 0, 1, 0)
您可以使用缺少的参数 iif_else_来自hablar:
library(hablar)
x <- c(NA, 1, 0, -1)
if_else_(x > 0, T, F, missing = F)
这给了你
[1] FALSE TRUE FALSE FALSE
如果您正在使用整数,则可以使用 %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