每列的總和

假設我們需要在資料集中執行每列的 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))

對於矩陣,如果我們想迴圈遍歷列,那麼使用 applyMARGIN = 1

 apply(m1, 2, FUN = sum, na.rm = TRUE)

有辦法用 dplyrdata.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]