0Pricing
R Academy · レッスン

計算と集計におけるNA

mean()、sum()などの集計関数でNAをどう扱うか制御します。

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

na.rm パラメータ

R の多くの集約関数は na.rm 引数(NA remove)を受け取ります。TRUE に設定すると、関数は計算前に NA を無視します。デフォルトは na.rm = FALSE であるため、NA が伝播します。

scores <- c(88, NA, 72, 95, NA, 81, 67)
cat('With na.rm=FALSE (default):
')
cat('  mean:', mean(scores), '
')           # NA
cat('  sum: ', sum(scores), '
')            # NA
cat('With na.rm=TRUE:
')
cat('  mean:', mean(scores, na.rm = TRUE), '
')  # 80.6
cat('  sum: ', sum(scores, na.rm = TRUE), '
')   # 403

na.rm を指定した mean()

mean(x, na.rm = TRUE) は欠損していない値の算術平均を計算します。分母には全体の長さではなく、値が存在する要素の数が使われます。

temperatures <- c(22.1, NA, 19.8, 25.1, NA, 17.3, 20.0)

cat('Total elements:', length(temperatures), '
')
cat('Present elements:', sum(!is.na(temperatures)), '
')
cat('Mean (na.rm=TRUE):', mean(temperatures, na.rm = TRUE), '
')

# Manual verification
cat('Manual mean:', sum(temperatures, na.rm=TRUE) / sum(!is.na(temperatures)), '
')

na.rm を指定した sum()

sum(x, na.rm = TRUE) は NA ではない値だけを加算します。NA を含む可能性のある logical ベクトルで TRUE の数を数えたり、不完全なデータから合計を求めたりする際に不可欠です。

sales_daily <- c(1200, NA, 980, 1450, NA, 1100, 890)
cat('Sum (default):', sum(sales_daily), '
')            # NA
cat('Sum (na.rm):  ', sum(sales_daily, na.rm = TRUE), '
')  # 5620

# Count observations meeting a condition (NA-safe)
cat('Days over 1000:', sum(sales_daily > 1000, na.rm = TRUE), '
')

na.rm を指定した min() と max()

min() と max() にも na.rm パラメータがあります。指定しない場合、入力に1つでも NA があると関数は NA を返します。na.rm = TRUE を指定すると、値が存在する要素の最小値または最大値が返されます。

blood_pressure <- c(120, NA, 135, 118, NA, 142, 125, NA, 130)
cat('Max BP (default):', max(blood_pressure), '
')              # NA
cat('Max BP (na.rm):  ', max(blood_pressure, na.rm = TRUE), '
')  # 142
cat('Min BP (na.rm):  ', min(blood_pressure, na.rm = TRUE), '
')  # 118
cat('Range (na.rm):   ', range(blood_pressure, na.rm = TRUE), '
')

na.rm を指定した var() と sd()

分散(var())と標準偏差(sd())も na.rm に対応しています。欠損していない観測値だけを使って統計量を計算し、自由度を自動的に調整します。

exam_scores <- c(78, 85, NA, 92, 68, 75, NA, 88, 91, NA)
n_valid <- sum(!is.na(exam_scores))
cat('Valid observations:', n_valid, '
')
cat('Mean:   ', round(mean(exam_scores, na.rm = TRUE), 2), '
')
cat('SD:     ', round(sd(exam_scores, na.rm = TRUE), 2), '
')
cat('Var:    ', round(var(exam_scores, na.rm = TRUE), 2), '
')

na.rm を指定した median() と quantile()

median() と quantile() は平均値よりも外れ値の影響を受けにくいことが多い関数ですが、欠損値を正しく処理するには na.rm = TRUE も必要です。

incomes <- c(45000, NA, 52000, 48000, NA, 210000, 51000, NA, 49000)
cat('Observations:', sum(!is.na(incomes)), '
')
cat('Median income:', median(incomes, na.rm = TRUE), '
')
cat('Mean income:  ', mean(incomes, na.rm = TRUE), '
')  # pulled up by 210000
cat('25th pctile:  ', quantile(incomes, 0.25, na.rm = TRUE), '
')
cat('75th pctile:  ', quantile(incomes, 0.75, na.rm = TRUE), '
')

na.rm を指定した prod() と cumsum()

prod(x, na.rm = TRUE) は NA ではない値の積を計算します。cumsum() のような累積関数には na.rm がありません。最初に欠損値が現れた時点から、NA が伝播します。

growth_rates <- c(1.05, NA, 1.03, 1.08, NA, 1.02)
cat('Product of rates:', prod(growth_rates, na.rm = TRUE), '
')

# cumsum propagates NAs
values <- c(10, 20, NA, 40, 50)
cat('cumsum (with NA):', cumsum(values), '
')

# Workaround: replace NA first
filled <- replace(values, is.na(values), 0)
cat('cumsum (NA=0):   ', cumsum(filled), '
')

apply 関数での na.rm

行列の行または列に対して apply() を使用する場合、... を使って関数に na.rm = TRUE を渡せます。これにより、NA を無視して集約処理を実行できます。

m <- matrix(c(88,NA,72, 95,81,NA, 67,75,90), nrow = 3)
cat('Matrix:
'); print(m)

# Row means ignoring NAs
cat('Row means (na.rm=TRUE):', apply(m, 1, mean, na.rm = TRUE), '
')

# Col means ignoring NAs
cat('Col means (na.rm=TRUE):', apply(m, 2, mean, na.rm = TRUE), '
')

na.rm を指定した rowSums() / colSums()

rowSums() と colSums() には独自の na.rm パラメータがあります(... 経由では渡しません)。na.rm = TRUE を指定すると、合計の計算で NA が 0 として扱われます。

sales <- matrix(c(100,NA,80, NA,90,70, 110,85,NA), nrow = 3)
cat('Sales matrix:
'); print(sales)

cat('Row sums (na.rm=F):', rowSums(sales), '
')             # NAs propagate
cat('Row sums (na.rm=T):', rowSums(sales, na.rm = TRUE), '
')
cat('Col means (na.rm=T):', colMeans(sales, na.rm = TRUE), '
')

比較: na.rm=FALSE と TRUE

na.rm = TRUE と FALSE のどちらを使うかは、分析の目的によって決まります。FALSE を指定すると、データが不完全であることを把握できます。TRUE を指定すると、利用可能なデータから最適な推定統計量を計算できます。

# Always check: how much data is missing BEFORE using na.rm=TRUE
collected <- c(78, NA, 85, NA, 91, 74, NA, 88, 82, NA)
pct_missing <- mean(is.na(collected)) * 100
cat('Missing:', round(pct_missing, 1), '% of data
')

if (pct_missing < 20) {
  cat('Acceptable: computing mean with na.rm=TRUE
')
  cat('Mean:', round(mean(collected, na.rm = TRUE), 2), '
')
} else {
  cat('Too much missing data — investigate before computing
')
}

ユーザー定義関数での na.rm

独自の集約関数を作成するときは、na.rm パラメーターを含め、基本 R 関数に渡してください。これにより、R の規約に従った一貫性のある関数になります。

# Custom function with na.rm support
cv <- function(x, na.rm = FALSE) {
  # Coefficient of Variation = SD / mean
  s <- sd(x, na.rm = na.rm)
  m <- mean(x, na.rm = na.rm)
  return(s / m)
}

readings <- c(22.1, NA, 19.8, 25.1, NA, 17.3, 20.0)
cat('CV (na.rm=FALSE):', cv(readings), '
')          # NA
cat('CV (na.rm=TRUE): ', round(cv(readings, na.rm = TRUE), 4), '
')

理解度チェック

mean(c(10, 20, NA, 40), na.rm = TRUE) は何を返しますか?

復習: 計算における NA

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

  • ほとんどの集約関数(mean、sum、min、max、sd など)には na.rm パラメーターがあります
  • na.rm = FALSE(デフォルト)は NA が伝播することを意味します。値のいずれかが NA なら、結果も NA になります
  • na.rm = TRUE は NA を無視し、存在する値だけから統計量を計算します
  • mean(na.rm=TRUE) の分母は、全体の長さではなく、NA でない値の個数です
  • na.rm=TRUE で統計量を計算する前に、欠損データの割合を必ず確認してください
  • R の規約に従うため、独自の集約関数にも na.rm を含めてください
# Complete summary with na.rm
data_vec <- c(55, NA, 72, 88, NA, 61, 79, NA, 93, 68)
cat('N valid:', sum(!is.na(data_vec)), '
')
cat('Mean:  ', round(mean(data_vec, na.rm=TRUE), 2), '
')
cat('Median:', median(data_vec, na.rm=TRUE), '
')
cat('SD:    ', round(sd(data_vec, na.rm=TRUE), 2), '
')
cat('Min:   ', min(data_vec, na.rm=TRUE), '
')
cat('Max:   ', max(data_vec, na.rm=TRUE), '
')

よくある質問

「計算と集計におけるNA」レッスンは無料ですか?

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

「計算と集計におけるNA」で何を学びますか?

mean()、sum()などの集計関数でNAをどう扱うか制御します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「計算と集計におけるNA」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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