HOWTO · R

如何在 R 中計算觀測值數量

使用基礎 R 和 dplyr 計算 R 資料框中的每一列、符合條件的列,或按群組統計出現次數。

本頁內容

在 R 資料框中,一個觀測值就是一列。使用 nrow() 取得觀測值總數,使用帶 sum() 的邏輯條件統計符合的列,或使用 dplyr 的 count() 取得按群組的頻率。範例使用一個小型資料框,方便你將欄位名稱換成自己的資料。

使用 nrow() 計算所有列

nrow(data) 傳回 data 中的列數。當每一列都需要計算時,這是直接的選擇。本範例有五列,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;它不會為每一列建立一個值,因此 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。當未知值應從計數中排除時,使用 na.rm = TRUE,如 sum(students$passed, na.rm = TRUE)。對於像 students$score > 70 這樣的運算式,這只會計算已知的大於 70 的分數;它不會將缺失的分數視為符合。

你也可以對資料框取子集,並使用 nrow() 計算其結果列:

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

drop = FALSE 引數使子集即使只包含一個欄位也保持資料框形式。如果條件可能包含 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 的學生;當條件為 NA 時,filter() 會丟棄該列。若要計算每個群組中的觀測值,請使用 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()。

這些選擇使結果的含義保持明確:列總數、符合條件的列,或頻率表。請檢查條件或分組運算式中使用的欄位是否代表你打算計算的值。