web-dev-qa-db-fra.com

Somme toutes les valeurs dans chaque colonne d'un data.frame dans R

Étant donné cet ensemble de données:

  Name Height Weight
1 Mary     65    110
2 John     70    200
3 Jane     64    115

J'aimerais additionner toutes les colonnes qualificatives (taille et poids) donnant

 199  425

Le problème est que les qualificatifs peuvent être plus que 2 (c'est-à-dire plus que simplement la taille et le poids).

Je peux le faire.

    # Create the dataframe people
    Name <- c("Mary", "John", "Jane")
    Height <- c(65,70,64)
    Weight <- c(110,200,115)
    people <- data.frame(Name, Height, Weight)

    res <- c(sum(people$Height),sum(people$Weight))

Mais cela prend trop de temps lorsque le qualificatif augmente… .. Quelle est la manière compacte de le faire?

27
pdubois

Vous pouvez utiliser la fonction colSums() pour calculer la somme de toutes les valeurs. [,-1] garantit que la première colonne avec les noms des personnes est exclue.

 colSums(people[,-1])
Height Weight 
   199    425

En supposant que plusieurs colonnes ne soient pas numériques ou que leur ordre ne soit pas fixe, une approche plus générale serait la suivante:

colSums(Filter(is.numeric, people))
57
Didzis Elferts
mapply(sum,people[,-1])

Height Weight 
   199    425 
2
dondapati

Nous pouvons utiliser dyplyr pour sélectionner uniquement les colonnes numériques et purr pour obtenir sum pour toutes les colonnes. (peut être utilisé pour obtenir quelle que soit la valeur de toutes les colonnes, telles que moyenne, minimum, maximum, etc.)

library("dplyr")
library("purrr")

people %>%
    select_if(is.numeric) %>%
    map_dbl(sum)

Ou un autre moyen simple de n'utiliser que dyplyr

library("dplyr")
people %>%
    summarize_if(is.numeric, sum, na.rm=TRUE)
0
camnesia

Par souci d'achèvement:

> apply(people[,-1], 2, function(x) sum(x))
Height Weight 
   199    425 
0
Workhorse