SASからRに来ました。ここでは、欠落している数値が無限大に設定されています。だから私たちはただ言うことができます:
positiveA = A > 0;
Rでは、次のように冗長にする必要があります。
positiveA <- ifelse(is.na(A),0, ifelse(A > 0, 1, 0))
この構文は読みにくいと思います。とにかく、すべての比較条件で常にfalseであるNAを特別な値と見なすようにifelse関数を変更できますか?そうでない場合は、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_
from 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