R Language
Operación sabia columna
Buscar..
suma de cada columna
Supongamos que necesitamos hacer la sum
de cada columna en un conjunto de datos
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])
Hay muchas maneras de hacer esto. Usando la base R
, la mejor opción sería colSums
colSums(df1[-1], na.rm = TRUE)
Aquí, eliminamos la primera columna ya que no es numérica e hicimos la sum
de cada columna, especificando na.rm = TRUE
(en caso de que haya NA en el conjunto de datos)
Esto también funciona con matrix
colSums(m1, na.rm = TRUE)
Esto se puede hacer en un bucle con lapply/sapply/vapply
lapply(df1[-1], sum, na.rm = TRUE)
Cabe señalar que la salida es una list
. Si necesitamos una salida vector
.
sapply(df1[-1], sum, na.rm = TRUE)
O
vapply(df1[-1], sum, na.rm = TRUE, numeric(1))
Para matrices, si queremos recorrer las columnas, entonces apply
con MARGIN = 1
apply(m1, 2, FUN = sum, na.rm = TRUE)
Hay formas de hacer esto con paquetes como dplyr
o data.table
library(dplyr)
df1 %>%
summarise_at(vars(matches("^V\\d+")), sum, na.rm = TRUE)
Aquí, estamos pasando una expresión regular para que coincida con los nombres de columna que necesitamos para obtener la sum
en summarise_at
. La expresión regular coincidirá con todas las columnas que comiencen con V
seguidas de uno o más números ( \\d+
).
Una opción data.table
es
library(data.table)
setDT(df1)[, lapply(.SD, sum, na.rm = TRUE), .SDcols = 2:ncol(df1)]
Convertimos 'data.frame' a 'data.table' ( setDT(df1)
), especificamos las columnas a las que se aplicará la función en .SDcols
y .SDcols
por el Subconjunto de Data.table ( .SD
) y obtenemos la sum
.
Si necesitamos utilizar un grupo por operación, podemos hacerlo fácilmente especificando el grupo por columna / columnas
df1 %>%
group_by(ID) %>%
summarise_at(vars(matches("^V\\d+")), sum, na.rm = TRUE)
En los casos en los que necesitamos la sum
de todas las columnas, summarise_each
se puede utilizar en lugar de summarise_at
df1 %>%
group_by(ID) %>%
summarise_each(funs(sum(., na.rm = TRUE)))
La opción data.table
es
setDT(df1)[, lapply(.SD, sum, na.rm = TRUE), by = ID]