每列的總和
假設我們需要在資料集中執行每列的 sum
set.seed(20)
df1 <- data.frame(ID = rep(c("A", "B", "C"), each = 3), V1 = rnorm(9), V2 = rnorm(9))
m1 <- as.matrix(df1[-1])
有很多方法可以做到這一點。使用 base R
,最好的選擇是 colSums
colSums(df1[-1], na.rm = TRUE)
在這裡,我們刪除了第一列,因為它是非數字的,並且執行了每列的 sum
,指定了 na.rm = TRUE
(如果資料集中有任何 NA)
這也適用於 matrix
colSums(m1, na.rm = TRUE)
這可以用 lapply/sapply/vapply
迴圈完成
lapply(df1[-1], sum, na.rm = TRUE)
應該注意的是,輸出是 list
。如果我們需要 vector
輸出
sapply(df1[-1], sum, na.rm = TRUE)
要麼
vapply(df1[-1], sum, na.rm = TRUE, numeric(1))
對於矩陣,如果我們想迴圈遍歷列,那麼使用 apply
和 MARGIN = 1
apply(m1, 2, FUN = sum, na.rm = TRUE)
有辦法用 dplyr
或 data.table
這樣的包來做到這一點
library(dplyr)
df1 %>%
summarise_at(vars(matches("^V\\d+")), sum, na.rm = TRUE)
在這裡,我們傳遞一個正規表示式來匹配我們在 summarise_at
中獲取 sum
所需的列名。正規表示式將匹配以 V
開頭的所有列,後跟一個或多個數字(\\d+
)。
一個 data.table
選項是
library(data.table)
setDT(df1)[, lapply(.SD, sum, na.rm = TRUE), .SDcols = 2:ncol(df1)]
我們將’data.frame’轉換為’data.table’(setDT(df1)
),指定要在 .SDcols
中應用函式的列並迴圈遍歷 Data.table(.SD
)的子集並獲取 sum
。
如果我們需要按操作使用組,我們可以通過按列/列指定組來輕鬆完成此操作
df1 %>%
group_by(ID) %>%
summarise_at(vars(matches("^V\\d+")), sum, na.rm = TRUE)
如果我們需要所有列的 sum
,可以使用 summarise_each
代替 summarise_at
df1 %>%
group_by(ID) %>%
summarise_each(funs(sum(., na.rm = TRUE)))
data.table
選項是
setDT(df1)[, lapply(.SD, sum, na.rm = TRUE), by = ID]