HOWTO · R

Rの1列にNAがある行を削除する

このチュートリアルでは、R のデータフレームから 1つの列に NA を持つ行を削除する方法を示します。

このページの内容

選択した1つの列に NA が含まれる行を削除するには、is.na() が FALSE となる行を残します。データフレーム df の列名が score の場合は、基本Rの式 df[!is.na(df$score), ] を使います。ここでの NA はRの欠損値を表すもので、文字列 "NA" そのものではありません。この条件が調べるのは score だけなので、他の列に欠損値があっても、残す行の選択には影響しません。

Rで is.na() を使って1つの列に NA を含む行を削除する

is.na() は各要素について論理値を返し、欠損値を TRUE として示します。その結果を否定し、行インデックスに使うと、欠損値のない要素を選択できます。この例では結果を kept に代入するため、元の df もそのまま利用できます。表示されるのは、残った行数、ID、スコアです。

df <- data.frame(id = c(1, 2, 3), score = c(10, NA, 30))
kept <- df[!is.na(df$score), ]
cat("Rows retained:", nrow(kept), "\n")
cat("IDs:", paste(kept$id, collapse = ", "), "\n")
cat("Scores:", paste(kept$score, collapse = ", "), "\n")

score を対象の列名に置き換えます。一般形は df[!is.na(df$column), ] です。この式は絞り込んだデータフレームを返します。結果を kept に代入すれば、元の df をそのまま残しておけます。要点は行インデックスです。指定した列に論理条件を適用し、その条件に合う行をデータフレーム全体から選択します。

Rで complete.cases() を使って1つの列に NA を含む行を削除する

complete.cases() は、指定した入力が完全かどうかを行ごとの論理値で返します。列を1つだけ渡すと、その列だけが判定対象になります。たとえば df[complete.cases(df$score), ] とします。データフレーム全体を渡すとすべての列が調べられ、score 以外の列の欠損値が原因で行が削除されることがあります。他の列を判定に含めたくない場合は、1列だけを指定してください。この方法で選ばれる行は is.na() を使う方法と同じです。これは基本Rの関数なので、追加パッケージは必要ありません。

Rで drop_na() を使って1つの列に NA を含む行を削除する

drop_na() は tidyr パッケージの関数です。tidyr::drop_na(df, score) と書くと、score に値がある行を残せます。列名を指定することで、その列だけを判定対象にできます。tidyr がインストールされていない場合は、install.packages("tidyr") でインストールします。この呼び出しは絞り込んだデータフレームを返すため、結果を保持して再利用するには変数に代入してください。列を省略して drop_na(df) とすると、すべての列が調べられます。他の列を判定に含めたくない場合は、対象の列を指定します。

Rで na.omit() を使って1つの列に NA を含む行を削除する

データフレーム全体に na.omit(df) を適用すると、いずれかの列に NA がある行が削除されます。この動作は、特定の列だけを対象にする絞り込みより範囲が広くなります。!is.na(df$score) で行を選んだ後に na.omit() を適用しても、別の列に欠損値があれば、その行が削除されることがあります。この用途では df[!is.na(df$score), ] を直接使えば、score だけを基準に行を残せます。na.omit() は、データフレーム内のどの列についても不完全な行を削除したい場合に適しています。

Rで subset() を使って1つの列に NA を含む行を削除する

subset() は、読みやすい基本Rの代替方法です。subset(df, !is.na(score)) のように使います。条件式はデータフレームの列を使って評価されるため、score は df 内の列を指し、他の列は条件に含まれません。戻り値には条件を満たす行が含まれます。たとえば kept <- subset(df, !is.na(score)) のように結果を代入すれば、元の df を残したまま再利用できます。角括弧を使う式と同様、条件に書いた列名によって選択される行が決まります。

Rで filter() を使って1つの列に NA を含む行を削除する

dplyr の filter() は、条件を使って行を選択する関数です。dplyr::filter(df, !is.na(score)) と呼び出すと、score に条件を適用できます。パッケージがまだない場合は、install.packages("dplyr") でインストールします。この呼び出しはデータフレームを返し、df を上書きしません。絞り込んだデータを後で使う場合は、結果を変数に代入してください。条件に指定しているのは score だけなので、この呼び出しでは他の列の欠損値は行の選択に影響しません。

まとめ

選んだ列だけを基準にするなら、df[!is.na(df$column), ] が基本Rで使える直接的な方法です。complete.cases(df$column) でも同様の論理マスクを作れます。これらのパッケージをすでに使っている場合は、tidyr::drop_na() や dplyr::filter() を選べます。na.omit(df) はデータフレーム全体に適用すると、対象列以外の NA が原因で行を削除することがあるため注意してください。残す行を1つの列だけで決めたい場合は、その列だけを指定する条件を使います。