NA値の削除と置換
na.omit()、complete.cases()、手動置換の方法を使います。
「NA値の削除と置換」はCoddyKit上の無料R Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。
NA を処理する方法
欠損値を処理する主な方法は3つあります。削除する、定数に置換する、統計的な推定値を使って補完する、の3つです。適切な方法は、データと分析の目的によって異なります。
data_vals <- c(88, NA, 72, NA, 91, 65, NA, 78)
cat('Original data:', data_vals, '
')
cat('NA count:', sum(is.na(data_vals)), '
')
# Strategy 1: remove
cat('After removal:', data_vals[!is.na(data_vals)], '
')
# Strategy 2: replace with 0
replaced <- data_vals; replaced[is.na(replaced)] <- 0
cat('Replaced with 0:', replaced, '
')x[!is.na(x)] による NA の削除
ベクトルから NA を削除する最も直接的な方法は、論理サブセット化 x[!is.na(x)] です。これにより、is.na(x) が FALSE(つまり値が存在する)である要素だけが残ります。
response_times <- c(1.2, NA, 0.9, 1.5, NA, 1.1, 0.8, NA, 1.3)
cat('With NAs: ', response_times, '
')
cat('Length:', length(response_times), '
')
clean_times <- response_times[!is.na(response_times)]
cat('Without NAs: ', clean_times, '
')
cat('Length:', length(clean_times), '
')
cat('Mean after removal:', round(mean(clean_times), 3), '
')ベクトルに対する na.omit()
na.omit(x) はベクトルから NA を削除します。x[!is.na(x)] と同等ですが、削除した NA の位置を 'na.action' という属性にも保存します。
scores <- c(88, NA, 72, NA, 91, 65, NA, 78)
clean_scores <- na.omit(scores)
cat('Original:', scores, '
')
cat('Cleaned: ', as.numeric(clean_scores), '
')
# na.omit records which positions were removed
removed_at <- attr(clean_scores, 'na.action')
cat('NAs were at positions:', removed_at, '
')データフレームに対する na.omit()
データフレームに na.omit(df) を適用すると、少なくとも1つの NA を含む行がすべて削除されます。これはリストワイズ削除と呼ばれ、観測値全体が削除されます。
df <- data.frame(
name = c('Alice', 'Bob', 'Carol', 'Dave', 'Eve'),
age = c(28, NA, 32, 45, 29),
salary = c(55000, 72000, NA, 90000, 61000)
)
cat('Original rows:', nrow(df), '
')
df_clean <- na.omit(df)
cat('After na.omit rows:', nrow(df_clean), '
')
print(df_clean)complete.cases() — 行単位の完全性
complete.cases(df) は、欠損値を含まない行に TRUE を設定した logical ベクトルを返します。完全な行の抽出や、不完全な行の特定に使用します。
df <- data.frame(
id = 1:5,
x = c(1, NA, 3, 4, NA),
y = c(NA, 2, 3, NA, 5)
)
cc <- complete.cases(df)
cat('Complete cases (T/F):', cc, '
')
cat('Complete rows:
')
print(df[cc, ])
cat('Number complete:', sum(cc), '
')NA を定数に置換する
NA を特定の値に置換するには、論理値による代入 x[is.na(x)] <- value を使用します。よく使われる置換値には、件数データの 0、連続データの平均値または中央値、factor のカテゴリラベルなどがあります。
# Replace with 0
counts <- c(5, NA, 3, NA, 8, 1, NA, 4)
counts_filled <- counts
counts_filled[is.na(counts_filled)] <- 0
cat('Original:', counts, '
')
cat('Filled: ', counts_filled, '
')
# Replace with mean of present values
mean_val <- mean(counts, na.rm = TRUE)
counts_mean <- counts
counts_mean[is.na(counts_mean)] <- mean_val
cat('Mean-filled:', round(counts_mean, 1), '
')replace() — 関数による置換
replace(x, list, values) は、list で指定した位置の要素を values に置き換えた、x の変更後のコピーを返します。元のオブジェクトを変更しない、関数型の置換方法です。
temps <- c(22.1, NA, 19.8, NA, 25.1)
cat('Original:', temps, '
')
# Replace NAs with the median
median_temp <- median(temps, na.rm = TRUE)
filled_temps <- replace(temps, is.na(temps), median_temp)
cat('Filled: ', filled_temps, '
')
cat('Original unchanged:', temps, '
') # original not modified前方補完(直前の観測値の繰り越し)
よく使われる補完方法に前方補完(LOCF)があります。これは各 NA を直前の既知の値に置き換える方法です。更新されるまで測定値を引き継ぐ時系列データで使用されます。
# Manual forward-fill
readings <- c(10, NA, NA, 13, NA, 15, NA, NA, 18)
filled <- readings
for (i in seq_along(filled)) {
if (is.na(filled[i]) && i > 1) {
filled[i] <- filled[i - 1]
}
}
cat('Original: ', readings, '
')
cat('Forward-filled:', filled, '
')文字ベクトル内の NA を置換する
同じ方法を文字ベクトルにも使用できます。文字列の NA を 'Unknown' や 'Missing' のようなラベルに置き換える方法は、カテゴリデータの分析で一般的です。
categories <- c('A', NA, 'B', 'A', NA, 'C', NA, 'B')
cat('Original:', categories, '
')
# Replace with 'Unknown'
filled_cat <- replace(categories, is.na(categories), 'Unknown')
cat('Filled: ', filled_cat, '
')
# Count each category
cat('Table:
')
print(table(filled_cat))条件付き置換の方法
別の列の値に応じて、異なる置換値を使用したい場合があります。そのようなときは、条件付きのインデックスを使って対象を絞り込んだ置換を行います。
# Scores: replace NA with group mean
group <- c('A', 'A', 'B', 'B', 'A', 'B')
scores <- c(85, NA, 72, NA, 90, 78)
mean_a <- mean(scores[group == 'A'], na.rm = TRUE)
mean_b <- mean(scores[group == 'B'], na.rm = TRUE)
imputed <- scores
imputed[is.na(imputed) & group == 'A'] <- mean_a
imputed[is.na(imputed) & group == 'B'] <- mean_b
cat('Original:', scores, '
')
cat('Imputed: ', imputed, '
')NA 削除方法のまとめ
R における NA 処理ツールのまとめ:
x[!is.na(x)]— ベクトルから NA を削除na.omit(x)— NA を削除(位置も記録)na.omit(df)— データフレームから不完全な行を削除complete.cases(df)— logical ベクトル:完全な行が TRUEx[is.na(x)] <- val— NA をその場で置換replace(x, is.na(x), val)— 関数による置換(コピーを返す)
v <- c(5, NA, 8, NA, 3, 7)
cat('Remove: ', v[!is.na(v)], '
')
cat('Replace with 0: ', replace(v, is.na(v), 0), '
')
cat('Replace with mean:', replace(v, is.na(v), mean(v, na.rm=TRUE)), '
')理解度チェック
na.omit(c(1, NA, 3, NA, 5)) は何を返しますか。
復習:NA の削除と置換
よくできました。このレッスンの重要なポイントは次のとおりです。
x[!is.na(x)]とna.omit(x)はベクトルから NA を削除するna.omit(df)はリストワイズ削除を行う(NA を含む行をすべて削除する)complete.cases(df)は欠損値のない行を特定するx[is.na(x)] <- valueは NA をその場で置換するreplace(x, is.na(x), value)は元のオブジェクトを変更せず、変更後のコピーを返す- データが欠損している理由と欠損量に基づいて方法を選択する
# Complete workflow: audit, then handle
data_raw <- c(82, NA, 75, NA, 91, 68, NA, 79)
cat('Missing:', sum(is.na(data_raw)), '/', length(data_raw), '
')
# Replace with median (robust to outliers)
imputed <- replace(data_raw, is.na(data_raw), median(data_raw, na.rm=TRUE))
cat('Before imputation mean:', round(mean(data_raw, na.rm=TRUE), 2), '
')
cat('After imputation mean: ', round(mean(imputed), 2), '
')よくある質問
「NA値の削除と置換」レッスンは無料ですか?
はい。「NA値の削除と置換」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。
「NA値の削除と置換」で何を学びますか?
na.omit()、complete.cases()、手動置換の方法を使います。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
R Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「NA値の削除と置換」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このR Academyレッスンでコードを書いて実行できますか?
はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- RにおけるNAの理解
- 欠損値の検出とカウント
- NA値の削除と置換
- 計算と集計におけるNA