每列的总和

假设我们需要在数据集中执行每列的 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]