R でブール演算子を使用して欠損値をチェックする
    
    Jesse John
    2023年6月21日
    
    R
    R Error
    
 
データを分析する際、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"
まとめ
データに欠損値がある可能性がある場合は常に、欠損値を他の値から分離するコードを作成する必要があります。
        チュートリアルを楽しんでいますか? <a href="https://www.youtube.com/@delftstack/?sub_confirmation=1" style="color: #a94442; font-weight: bold; text-decoration: underline;">DelftStackをチャンネル登録</a> して、高品質な動画ガイドをさらに制作するためのサポートをお願いします。 Subscribe
    
著者: Jesse John
    
