Recherche…


somme de chaque colonne

Supposons que nous devions faire la sum de chaque colonne d'un ensemble de données

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])

Il y a plusieurs façons de le faire. En utilisant la base R , la meilleure option serait colSums

colSums(df1[-1], na.rm = TRUE)

Ici, nous avons supprimé la première colonne car elle est non numérique et fait la sum de chaque colonne, en spécifiant le na.rm = TRUE (au cas où il y aurait des NA dans le jeu de données)

Cela fonctionne aussi avec la matrix

colSums(m1, na.rm = TRUE)

Cela peut être fait dans une boucle avec lapply/sapply/vapply

 lapply(df1[-1], sum, na.rm = TRUE)

Il convient de noter que la sortie est une list . Si nous avons besoin d'une sortie vector

 sapply(df1[-1], sum, na.rm = TRUE)

Ou

 vapply(df1[-1], sum, na.rm = TRUE, numeric(1))

Pour les matrices, si vous voulez parcourir les colonnes, utilisez apply avec MARGIN = 1

 apply(m1, 2, FUN = sum, na.rm = TRUE)

Il existe des moyens de le faire avec des packages tels que dplyr ou data.table

 library(dplyr)
 df1 %>%
     summarise_at(vars(matches("^V\\d+")), sum, na.rm = TRUE)

Ici, nous passons une expression régulière pour correspondre aux noms de colonne dont nous avons besoin pour obtenir la sum dans votre summarise_at . Le regex correspondra à toutes les colonnes commençant par V suivi d'un ou plusieurs nombres ( \\d+ ).

Une option data.table est

library(data.table)   
setDT(df1)[, lapply(.SD, sum, na.rm = TRUE), .SDcols = 2:ncol(df1)]

Nous convertissons le 'data.frame' en 'data.table' ( setDT(df1) ), spécifions les colonnes à appliquer à la fonction dans .SDcols et .SDcols le sous-ensemble de Data.table ( .SD ) et obtenons la sum .


Si nous devons utiliser un groupe par opération, nous pouvons le faire facilement en spécifiant le groupe par colonne / colonnes.

 df1 %>%
   group_by(ID) %>%   
   summarise_at(vars(matches("^V\\d+")), sum, na.rm = TRUE)

Dans les cas où nous avons besoin de la sum de toutes les colonnes, summarise_each peut être utilisé à la place de summarise_at

df1 %>%
    group_by(ID) %>%
    summarise_each(funs(sum(., na.rm = TRUE)))

L'option data.table est

setDT(df1)[, lapply(.SD, sum, na.rm = TRUE), by = ID]   


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow