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