R Language
Работа с колонкой
Поиск…
сумма каждого столбца
Предположим, нам нужно сделать 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)
Здесь мы передаем регулярное выражение, чтобы соответствовать именам столбцов, которые нам нужны, чтобы получить sum
в summarise_at
. Регулярное выражение будет соответствовать всем столбцам, начинающимся с 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]