R でブール演算子を使用して欠損値をチェックする
Jesse John
2023年6月21日
データを分析する際、CSV ファイルなどの外部ソースからデータをインポートすることがあります。 データには、NA
とマークされた欠損値が含まれる場合があります。
データ内の異なる値を確認する必要がある場合、または NA
を確認する必要がある場合は、エラーを回避するために、まず欠損値に対処する必要があります。 この記事では、その方法を説明します。
問題と解決策を示すために、単純なベクトルを作成します。
サンプルコード:
myVec = c(50, 60, NA, 40, 80)
R の既存の値と欠損値のチェック中にエラーが発生しました
まず、ベクトルに存在することがわかっている値 60
を確認します。
その後、欠損値をチェックします。 どちらも同じエラーになります。
サンプルコード:
# Value 60 exists.
for(i in 1:length(myVec))
if(myVec[i] == 60) {print("Present")}
# A missing value, NA, exists.
for(i in 1:length(myVec))
if(myVec[i] == NA) {print("Missing")}
出力:
> # Value 60 exists.
> for(i in 1:length(myVec))
+ if(myVec[i] == 60) {print("Present")}
[1] "Present"
Error in if (myVec[i] == 60) { : missing value where TRUE/FALSE needed
> # A missing value, NA, exists.
> for(i in 1:length(myVec))
+ if(myVec[i] == NA) {print("Missing")}
Error in if (myVec[i] == NA) { : missing value where TRUE/FALSE needed
if
ステートメントに入力したブール条件が、値を NA
と比較するか、NA
と NA
を比較するため、このエラーが発生しました。 このようなブール条件は、TRUE
または FALSE
ではなく NA
を評価します。
サンプルコード:
# This evaluates to NA rather than TRUE.
NA == NA
# This evaluates to NA rather than FALSE.
NA != NA
# Therefore, the following code raises the error:
# "missing value where TRUE/FALSE needed".
if(NA) print("Correct")
出力:
> # This evaluates to NA rather than TRUE.
> NA == NA
[1] NA
>
> # This evaluates to NA rather than FALSE.
> NA != NA
[1] NA
>
> # Therefore, the following code raises the error:
> # "missing value where TRUE/FALSE needed".
> if(NA) print("Correct")
Error in if (NA) print("Correct") : missing value where TRUE/FALSE needed
is.na()
関数を使用して R の欠損値を探す
欠損値によって引き起こされる問題を回避するには、is.na()
関数を使用して欠損値を特定する必要があります。 これらは、一連の if
および else
条件、またはネストされた if
および else
条件を使用して処理できます。
基本的な要件は次のとおりです。
NA
値は、他のすべての値とは別に一致させる必要があります。- 他の値を確認するときは、
NA
値を明示的に除外する必要があります。
サンプルコード:
# Using a sequence of if and else conditions.
for(i in 1:length(myVec)){
if(!is.na(myVec[i]) & myVec[i] == 60){
print("Match found")} else
if(!is.na(myVec[i]) & myVec[i] != 60){
print("Match not found")} else
if(is.na(myVec[i])) {
print("Found NA")}
}
# Using a nested if.
for(i in 1:length(myVec)){
if(!is.na(myVec[i])){
if(myVec[i]==60){
print("Match Found")} else {
print("Match not found")}
} else {
print("Found NA")}
}
出力:
> # Using a sequence of if and else conditions.
> for(i in 1:length(myVec)){
+ if(!is.na(myVec[i]) & myVec[i] == 60){
+ print("Match found")} else
+ if(!is.na(myVec[i]) & myVec[i] != 60){
+ print("Match not found")} else
+ if(is.na(myVec[i])) {
+ print("Found NA")}
+ }
[1] "Match not found"
[1] "Match found"
[1] "Found NA"
[1] "Match not found"
[1] "Match not found"
>
> # Using a nested if.
> for(i in 1:length(myVec)){
+ if(!is.na(myVec[i])){
+ if(myVec[i]==60){
+ print("Match Found")} else {
+ print("Match not found")}
+ } else {
+ print("Found NA")}
+ }
[1] "Match not found"
[1] "Match Found"
[1] "Found NA"
[1] "Match not found"
[1] "Match not found"
まとめ
データに欠損値がある可能性がある場合は常に、欠損値を他の値から分離するコードを作成する必要があります。
著者: Jesse John