HOWTO · R

R で観測数を数える方法

基本 R と dplyr を使って、R のデータフレームのすべての行、条件を満たす行、またはグループごとの出現回数を数えます。

このページの内容

R のデータフレームでは、観測は 1 行です。観測の総数には nrow() を、一致する行には sum() と論理条件を、グループごとの頻度には dplyr の count() を使います。例では小さなデータフレームを使っているので、列名を自分のデータに合わせられます。

nrow() で全行を数える

nrow(data) は data の行数を返します。すべての行を数えたい場合の直接的な選択肢です。この例には 5 行あり、nrow(students) が以下に表示される値を返します。

students <- data.frame(
  name = c("Ada", "Ben", "Cam", "Dee", "Eli"),
  passed = c(TRUE, FALSE, TRUE, TRUE, FALSE),
  group = c("A", "A", "B", "B", "B")
)

total <- nrow(students)
cat("Total observations:", total, "\n")
Total observations: 5

行の総数を求める場合、nrow() は論理ベクトルを構築するよりも明確です。特に、with(data, 1) はスカラー 1 を評価します。各行に 1 つの値を作成するわけではないため、sum(with(data, 1)) は行を数える方法ではありません。

基本 R で条件を満たす行を数える

条件を満たす行を数えるには、論理ベクトルを作成して sum() に渡します。R では、合計すると TRUE は 1、FALSE は 0 として寄与します。with() を使うと、データフレーム名を繰り返さずにデータフレームの列を参照できます。

sum(with(students, passed))

複数の条件は、「かつ」には &、「または」には | で組み合わせます。たとえば、sum(with(students, passed & group == "B")) は、合格してグループ B に属する学生を数えます。組み合わせた条件が読みやすくなる場合は括弧を使ってください。

条件に NA が含まれる場合、それらの値を処理しない限り sum() は NA を返します。未知の値を数から除外する場合は、sum(students$passed, na.rm = TRUE) のように na.rm = TRUE を使います。students$score > 70 のような式の場合、これで数えられるのは 70 を超える既知のスコアのみで、欠損したスコアは一致として扱われません。

データフレームの部分集合を作り、その結果の行を nrow() で数えることもできます。

nrow(students[students$passed, , drop = FALSE])

drop = FALSE 引数は、部分集合が 1 列しか含まない場合でもデータフレーム形式を保持します。条件に NA が含まれる可能性がある場合は、まず論理インデックスから未知の行を除去してください。たとえば students[!is.na(students$passed) & students$passed, , drop = FALSE] です。そうしないと、基本 R は未知の条件に対してすべて NA の行を含めることがあります。フィルタした行が後の作業に必要な場合はこの方法を、数だけが必要な場合は sum() を使ってください。別の例でのフィルタ後の行数の数え方については、グループごとに行を数えるを参照してください。

dplyr で行とグループを数える

dplyr は、行を選択する filter() と、各グループに現れる行数を報告する count() を提供します。これらの操作は異なる問いに答えます。条件を満たす行数には filter() の後に nrow() を使い、各値または値の組み合わせごとの頻度が欲しい場合は count() を使います。

たとえば、nrow(dplyr::filter(students, passed)) は passed の値が TRUE の学生を数えます。filter() は条件が NA の行を除外します。各グループの観測数を数えるには、dplyr::count(students, group) を使います。組み合わせを数えるには、dplyr::count(students, group, passed) のようにグループ化列を増やします。これらの呼び出しは説明のためのもので、ここでは実行されていません。提供された実行エビデンスがカバーするのは行総数の例のみです。

count() は、グループ化列と、デフォルトで n という名前のカウント列を返します。その wt 引数は代わりに各グループ内の重み列を合計します。これは通常の行数ではなく重み付き合計です。単純な観測数が必要な場合は、wt を設定しないでください。

質問に合った方法を選ぶ

  • すべての行を数えるには nrow(data) を使います。
  • 条件で選択された行を数えるには sum(condition) または nrow(data[condition, , drop = FALSE]) を使います。
  • dplyr でフィルタした行を数える場合は filter() と nrow() を、グループごとの頻度が欲しい場合は count() を使います。

これらの選択により、結果の意味(行の総数、条件を満たす行、または頻度表)が明示的になります。条件やグループ化式で使われる列が、数えたい値を表していることを確認してください。