0Pricing
R Academy · レッスン

RにおけるNAの理解

NAの意味や伝播する理由、NULLとの違いを学びます。

「RにおけるNAの理解」はCoddyKit上の無料R Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。

RのNAとは

NAはNot Available(利用できない)を表し、欠損値または未知の値を示します。NULL(オブジェクトが存在しないこと)やNaN(数値ではないこと)とは異なり、NAはデータ自体は存在するものの値が不明である場合のプレースホルダーです。

# NA represents a missing value
height_cm <- c(175, NA, 162, 188, NA, 170)
cat('Heights:', height_cm, '
')
cat('Length:', length(height_cm), '
')  # NA counts as an element
cat('Sum:', sum(height_cm), '
')        # NA propagates

NAとNULLの違い

NAはベクトルの内部にある欠損値です。格納場所は存在しますが、値が分かっていません。NULLはオブジェクト自体が完全に存在しない状態です。長さは0で、ベクトルの内部に格納することはできません。

# NA: element exists, value unknown
vec_with_na <- c(1, NA, 3)
cat('Vector with NA, length:', length(vec_with_na), '
')  # 3

# NULL: nothing there at all
vec_with_null <- c(1, NULL, 3)
cat('Vector with NULL, length:', length(vec_with_null), '
')  # 2!

# NULL gets dropped; NA is kept
cat('vec_with_na:', vec_with_na, '
')
cat('vec_with_null:', vec_with_null, '
')

NAとNaNの違い

NaN(Not a Number)は、0/0やsqrt(-1)のような数学的に定義できない演算の結果として生じます。これは特殊な数値です。一方、NAは、どのような型にも適用できる一般的な欠損値のマーカーです。

# NaN from undefined operations
cat('0/0 =', 0/0, '
')          # NaN
cat('sqrt(-1) =', sqrt(-1), '
') # NaN (with warning)
cat('Inf - Inf =', Inf - Inf, '
') # NaN

# NaN IS also NA (a special case)
cat('is.nan(NaN):', is.nan(NaN), '
')
cat('is.na(NaN): ', is.na(NaN), '
')  # TRUE!
cat('is.nan(NA): ', is.nan(NA), '
')  # FALSE

NA と Inf の違い

Inf と -Inf は正の無限大と負の無限大を表し、1/0 のような演算によって生じます。NA とは異なり、Inf は極端ではありますが既知の数値であり、比較演算にも通常どおり参加します。

cat('1/0 =', 1/0, '
')         # Inf
cat('-1/0 =', -1/0, '
')       # -Inf
cat('Inf + 1 =', Inf + 1, '
') # Inf
cat('Inf > 1000:', Inf > 1000, '
')  # TRUE
cat('is.infinite(Inf):', is.infinite(Inf), '
')
cat('is.na(Inf):       ', is.na(Inf), '
')  # FALSE

算術演算における NA の伝播

算術演算では NA は伝播します。NA を含む演算はすべて NA を返します。これは意図的な動作です。計算に含まれる値の1つが不明であれば、結果も不明になるためです。

x <- NA
cat('NA + 5:  ', x + 5, '
')      # NA
cat('NA * 0:  ', x * 0, '
')      # NA (not 0!)
cat('NA == NA:', x == NA, '
')     # NA (not TRUE!)
cat('NA > 5:  ', x > 5, '
')      # NA
cat('sum(1,NA):', sum(1, NA), '
') # NA

typeof(NA) — 型付き NA

デフォルトの NA の型は logical です。R には、各 atomic 型に対応する型付き NA も用意されています。型付きベクトルを扱う際に、意図しない型変換を避けるために重要です。

cat('typeof(NA):            ', typeof(NA), '
')           # logical
cat('typeof(NA_integer_):  ', typeof(NA_integer_), '
')   # integer
cat('typeof(NA_real_):     ', typeof(NA_real_), '
')      # double
cat('typeof(NA_complex_):  ', typeof(NA_complex_), '
')   # complex
cat('typeof(NA_character_):', typeof(NA_character_), '
') # character

実際の NA_integer_ の使い方

欠損値を含む integer ベクトルを作成する場合は、NA_integer_ を使用してベクトルの型を維持します。通常の NA を使用すると、状況によっては暗黙的に double 型へ変換されます。

# Using plain NA in an integer vector
v1 <- c(1L, 2L, NA, 4L)
cat('typeof with NA:         ', typeof(v1), '
')  # integer (OK here)

# Explicit typed NA is safer in functions
v2 <- c(1L, 2L, NA_integer_, 4L)
cat('typeof with NA_integer_:', typeof(v2), '
')  # integer

# Check they behave the same
cat('Same?', identical(v1, v2), '
')

NA_real_ と NA_character_

NA_real_ は double(numeric)ベクトルの欠損値に、NA_character_ は欠損した文字列に使用します。型の一貫性が重要となる関数内でベクトルを構築する場合に、特に重要です。

# Character vector with missing
names_vec <- c('Alice', 'Bob', NA_character_, 'Dave')
cat('Names:', names_vec, '
')
cat('typeof:', typeof(names_vec), '
')

# Numeric with missing
readings <- c(22.5, NA_real_, 21.3, NA_real_, 24.1)
cat('Readings:', readings, '
')
cat('Non-NA count:', sum(!is.na(readings)), '
')

論理演算における NA

論理演算における NA は三値論理に従います。TRUE | NA は TRUE です(TRUE と何を OR しても TRUE になるため)。一方、FALSE | NA は NA です(NA の値が分からなければ結果を確定できないためです)。

cat('TRUE  | NA:', TRUE | NA, '
')   # TRUE
cat('FALSE | NA:', FALSE | NA, '
')  # NA
cat('TRUE  & NA:', TRUE & NA, '
')   # NA
cat('FALSE & NA:', FALSE & NA, '
')  # FALSE

# Never use == to test for NA!
cat('NA == NA:', NA == NA, '
')    # NA (not TRUE!)
cat('is.na(NA):', is.na(NA), '
')  # TRUE (correct way)

ベクトルとデータフレームにおける NA

実際のデータでは、欠損値が頻繁に現れます。NA の動作を理解すると、集計結果を正しく解釈し、データ品質の問題を見つけ、適切な処理方法を選択できるようになります。

ages <- c(25, NA, 32, NA, 29, 41, NA, 35)
cat('Ages:', ages, '
')
cat('Length:', length(ages), '
')
cat('Missing count:', sum(is.na(ages)), '
')
cat('Present count:', sum(!is.na(ages)), '
')
cat('Mean (fails):', mean(ages), '
')           # NA
cat('Mean (works):', mean(ages, na.rm = TRUE), '
') # 32.4

NA の型:全体像

R における NA 関連の特殊な値をまとめると、次のとおりです。

  • NA — 一般的な欠損値(logical 型)
  • NA_integer_、NA_real_、NA_complex_、NA_character_ — 型付き NA
  • NaN — 未定義の数値(0/0、sqrt(-1) の結果)
  • Inf、-Inf — 無限大の値(1/0 の結果)
  • NULL — オブジェクトが存在しない状態(長さ 0)
# Test functions for special values
x <- c(1, NA, NaN, Inf, -Inf, 0)
cat('Values:         ', x, '
')
cat('is.na():        ', is.na(x), '
')        # TRUE for NA and NaN
cat('is.nan():       ', is.nan(x), '
')       # TRUE only for NaN
cat('is.infinite():  ', is.infinite(x), '
')  # TRUE for Inf and -Inf
cat('is.finite():    ', is.finite(x), '
')    # TRUE only for normal numbers

理解度チェック

R で NA == NA を評価すると、何が返されますか。

復習:NA を理解する

すばらしいです。このレッスンの重要なポイントは次のとおりです。

  • NA = 欠損値(存在することは分かっているが、値は不明)
  • NULL = オブジェクトが存在しない状態(ベクトルから除外される)
  • NaN = 未定義の算術結果(NA でもある)
  • Inf / -Inf = 無限大の値(NA ではない)
  • 算術演算では NA が伝播する — NA に対する演算は NA を返す
  • 型安全なコードには型付き NA(NA_integer_ など)を使用する
  • NA の判定には必ず is.na() を使用し、== NA は使用しない
# Key tests side by side
special_vals <- list(NA=NA, NaN=NaN, Inf=Inf, 'NULL-in-vec'=c(1,NULL,3)[2])
for (name in names(special_vals)) {
  v <- special_vals[[name]]
  cat(name, '| is.na:', is.na(v), '| is.nan:', is.nan(v[!is.infinite(v)]), '
')
}

よくある質問

「RにおけるNAの理解」レッスンは無料ですか?

はい。「RにおけるNAの理解」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「RにおけるNAの理解」で何を学びますか?

NAの意味や伝播する理由、NULLとの違いを学びます。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

R Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「RにおけるNAの理解」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このR Academyレッスンでコードを書いて実行できますか?

はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. RにおけるNAの理解
  2. 欠損値の検出とカウント
  3. NA値の削除と置換
  4. 計算と集計におけるNA
← R Academyに戻る