web-dev-qa-db-ja.com

ifelseステートメントでNAを無視する方法

SASからRに来ました。ここでは、欠落している数値が無限大に設定されています。だから私たちはただ言うことができます:

positiveA = A > 0;

Rでは、次のように冗長にする必要があります。

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

この構文は読みにくいと思います。とにかく、すべての比較条件で常にfalseであるNAを特別な値と見なすようにifelse関数を変更できますか?そうでない場合は、NAを-Infと見なしても機能します。

同様に、文字変数のifelseステートメントでNAを ''(空白)に設定します。

ありがとう。

9
AdamNYC

この構文は読みやすいです:

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
14
Josh O'Brien

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はここで賢明です。

8
mnel

これを試して:

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

欠落している引数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
1
davsjob

整数を使用している場合は、%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
0
skan