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]   


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow