R でブール演算子を使用して欠損値をチェックする

Jesse John 2023年6月21日
  1. R の既存の値と欠損値のチェック中にエラーが発生しました
  2. is.na() 関数を使用して R の欠損値を探す
  3. まとめ
R でブール演算子を使用して欠損値をチェックする

データを分析する際、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 と比較するか、NANA を比較するため、このエラーが発生しました。 このようなブール条件は、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 条件を使用して処理できます。

基本的な要件は次のとおりです。

  1. NA 値は、他のすべての値とは別に一致させる必要があります。
  2. 他の値を確認するときは、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
Jesse John avatar Jesse John avatar

Jesse is passionate about data analysis and visualization. He uses the R statistical programming language for all aspects of his work.

関連記事 - R Error