欠損値の検出とカウント
is.na()、anyNA()、sum(is.na())を使って欠損データを点検します。
「欠損値の検出とカウント」はCoddyKit上の無料R Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。
is.na() — 基本的な検出ツール
is.na(x) は x の各要素を検査し、同じ長さのlogical ベクトルを返します。値が NA(または NaN)である位置は TRUE になります。これは欠損値を検出する基本的なツールです。
heights <- c(175, NA, 162, 188, NA, 170, NA, 165)
cat('Heights:', heights, '
')
cat('is.na() :', is.na(heights), '
')
cat('!is.na():', !is.na(heights), '
')sum(is.na()) による NA のカウント
算術演算では TRUE == 1、FALSE == 0 となるため、sum(is.na(x)) で欠損値の総数を数えられます。mean(is.na(x)) では欠損値の割合が得られます。
survey <- c(8, NA, 6, NA, 9, 7, NA, 5, NA, 8)
cat('Survey responses:', survey, '
')
cat('Total NAs: ', sum(is.na(survey)), '
')
cat('Total present:', sum(!is.na(survey)), '
')
cat('NA proportion:', mean(is.na(survey)), '
')
cat('NA percentage:', mean(is.na(survey)) * 100, '%
')anyNA() — 存在をすばやく確認
anyNA(x) は、いずれかの要素が NA であれば単一の TRUE を、それ以外の場合は FALSE を返します。最初に見つかった NA の時点で処理を停止するため、any(is.na(x)) より高速です。
complete_data <- c(1, 2, 3, 4, 5)
incomplete_data <- c(1, 2, NA, 4, 5)
cat('anyNA(complete) :', anyNA(complete_data), '
') # FALSE
cat('anyNA(incomplete):', anyNA(incomplete_data), '
') # TRUE
# Use in validation
if (anyNA(incomplete_data)) {
cat('Warning: data contains missing values!
')
}which(is.na()) — 位置を検索
which(is.na(x)) は、ベクトル内で欠損値があるインデックス(位置)を返します。どの観測値が欠損しているかを監査したり、対象を絞って補完したりする際に不可欠です。
temperatures <- c(22.1, NA, 19.8, NA, 25.1, NA, 17.3, 20.0)
cat('Temperatures:', temperatures, '
')
missing_pos <- which(is.na(temperatures))
cat('Missing at positions:', missing_pos, '
')
cat('Number missing:', length(missing_pos), '
')
# What values are NOT missing?
present_pos <- which(!is.na(temperatures))
cat('Present at positions:', present_pos, '
')データフレーム内の NA をカウントする
データフレームに対して is.na(df) を実行すると、同じ次元の logical 行列が返されます。これを colSums() と組み合わせると、列ごとの欠損値の数を求められ、データ品質をすばやく監査できます。
# Simulate a small data frame
name_col <- c('Alice', 'Bob', 'Carol', 'Dave', 'Eve')
age_col <- c(28, NA, 32, NA, 29)
sal_col <- c(55000, 72000, NA, 90000, 61000)
scr_col <- c(88, NA, 75, NA, NA)
cat('Age NAs: ', sum(is.na(age_col)), '
')
cat('Salary NAs:', sum(is.na(sal_col)), '
')
cat('Score NAs: ', sum(is.na(scr_col)), '
')colSums(is.na(df)) パターン
colSums(is.na(df)) というパターンは、データフレームの列ごとの欠損値を数える最も高速な方法です。各列に含まれる NA の数を示す、名前付き numeric ベクトルが返されます。
# Build a data frame manually
df <- data.frame(
name = c('Alice', 'Bob', 'Carol', 'Dave', 'Eve'),
age = c(28, NA, 32, NA, 29),
salary = c(55000, 72000, NA, 90000, 61000),
score = c(88, NA, 75, NA, NA)
)
cat('Missing values per column:
')
print(colSums(is.na(df)))
cat('Total missing:', sum(is.na(df)), '
')列ごとの NA の割合
行数で割ると、列ごとの欠損値の割合が得られます。列によって長さが異なる場合、生の件数よりも有用な情報になります。
df <- data.frame(
x1 = c(1, NA, 3, NA, 5),
x2 = c(NA, 2, NA, 4, NA),
x3 = c(1, 2, 3, NA, 5)
)
n_rows <- nrow(df)
na_counts <- colSums(is.na(df))
na_pct <- round(na_counts / n_rows * 100, 1)
cat('NA counts: '); print(na_counts)
cat('NA percentage: '); print(na_pct)table(is.na()) — 度数を数える
table(is.na(x)) は、FALSE(値あり)と TRUE(欠損)の値がそれぞれいくつあるかを示す、名前付きの度数表を作成します。一目で簡単に確認できます。
responses <- c(5, NA, 8, 6, NA, 9, 7, NA, NA, 8)
cat('NA frequency table:
')
print(table(is.na(responses)))
# For multiple columns:
cat('Age table:
')
ages <- c(28, NA, 32, NA, 29)
print(table(is.na(ages)))NA を含む行を検索する
データフレーム内で、少なくとも1つの欠損値を含む行を検索するには、apply(is.na(df), 1, any) を使用します。結果は logical ベクトルで、不完全な行が TRUE になります。
df <- data.frame(
id = 1:5,
age = c(28, NA, 32, NA, 29),
salary = c(55000, 72000, NA, 90000, 61000)
)
# Which rows have at least one NA?
has_na <- apply(is.na(df), 1, any)
cat('Rows with any NA:', which(has_na), '
')
cat('Complete rows: ', which(!has_na), '
')
cat('Complete row count:', sum(!has_na), '/', nrow(df), '
')完全なデータセットを監査する
実践的な NA 監査の手順は、分析前に欠損値を数え、位置を特定し、報告してデータ品質を把握することです。次に、単独で使用できる監査関数を示します。
audit_na <- function(v, label) {
n_total <- length(v)
n_missing <- sum(is.na(v))
pct <- round(n_missing / n_total * 100, 1)
positions <- which(is.na(v))
cat(label, ':', n_missing, '/', n_total,
'(', pct, '%) NA at positions', positions, '
')
}
heights <- c(175, NA, 162, 188, NA, 170)
weights <- c(70, 85, NA, 92, 68, NA)
audit_na(heights, 'Height')
audit_na(weights, 'Weight')NA 検出のまとめ
NA 検出ツールのクイックリファレンス:
is.na(x)— logical ベクトル:NA の位置が TRUEanyNA(x)— 単一の TRUE/FALSE:NA が存在するかsum(is.na(x))— NA の件数mean(is.na(x))— NA の割合which(is.na(x))— NA の位置colSums(is.na(df))— 列ごとの NA の件数table(is.na(x))— NA と非 NA の度数表
x <- c(10, NA, 30, NA, 50, NA, 70)
cat('is.na: ', is.na(x), '
')
cat('anyNA: ', anyNA(x), '
')
cat('sum(is.na): ', sum(is.na(x)), '
')
cat('mean(is.na): ', mean(is.na(x)), '
')
cat('which(is.na):', which(is.na(x)), '
')理解度チェック
sum(is.na(c(1, NA, 3, NA, 5))) は何を返しますか。
復習:NA の検出とカウント
よくできました。このレッスンの重要なポイントは次のとおりです。
is.na(x)が基本ツールで、logical ベクトルを返すsum(is.na(x))は欠損値を数え、mean(is.na(x))は割合を求めるanyNA(x)は NA の存在をすばやく確認するwhich(is.na(x))で NA の正確な位置が分かるcolSums(is.na(df))はデータフレームを監査する標準的な方法- NA の検出に
x == NAは決して使用せず、必ずis.na(x)を使用する
# Full audit of a data frame in 3 lines
df <- data.frame(a=c(1,NA,3), b=c(NA,2,NA), c=c(1,2,3))
cat('Per column:', colSums(is.na(df)), '
')
cat('Total: ', sum(is.na(df)), '/', nrow(df)*ncol(df), '
')
cat('Complete rows:', sum(complete.cases(df)), '/', nrow(df), '
')よくある質問
「欠損値の検出とカウント」レッスンは無料ですか?
はい。「欠損値の検出とカウント」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。
「欠損値の検出とカウント」で何を学びますか?
is.na()、anyNA()、sum(is.na())を使って欠損データを点検します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
R Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「欠損値の検出とカウント」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このR Academyレッスンでコードを書いて実行できますか?
はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- RにおけるNAの理解
- 欠損値の検出とカウント
- NA値の削除と置換
- 計算と集計におけるNA