web-dev-qa-db-fra.com

Calculer la somme d'une liste de variables par groupe

J'ai un data.table avec une clé et environ 100 lignes numériques, dont l'une est définie sur clé. Je voudrais créer une nouvelle variable qui contient la sommation de chaque ligne numérique, regroupée par clé.

Par exemple, mes données en ce moment sont

ID Count1 Count2 Count3
1   1      3      0
1   3      3      3
2   1      2      1
3   1      1      2

Ce que j'aimerais avoir, c'est:

ID Count1 Count2 Count3
1   4      6      3
2   1      2      1
3   1      1      2

J'ai essayé tant de façons d'obtenir cela. Je sais que je peux faire:

Y <- X[, list(Count=sum(Count1), Count2=sum(Count2), Count3=sum(Count3), by = ID]

Cependant, j'ai des centaines de variables, et je n'ai que leurs noms sur une liste. Comment dois-je procéder pour gérer cela?

Merci beaucoup pour votre aide.

Voici un code pour générer des données de test:

ID <-c(rep(210, 9), rep(3917,6))
Count1 <- c(1,1,0,1,3,1,4,1,1,1,1,1,1,0,1)
Count2 <- c(1,0,0,1,0,1,0,1,1,1,1,1,1,0,1)
Count3 <- c(1,0,0,1,0,1,0,1,1,1,1,1,1,0,1)
x <- data.table(ID, Count1, Count2, Count3)
setkey(x, ID)
23
AdamNYC

Vos données de test ne correspondent pas à l'exemple que vous avez donné, mais peu importe - vous pouvez profiter du fait que data.table() a un opérateur nommé .SD Pour "sous-ensemble de données. Donc cela devrait fonctionner :

x[, lapply(.SD, sum), by = ID]
#----
     ID Count Count2 Count3
1:  210    13      5      5
2: 3917     5      5      5

Ceci est en fait couvert dans la FAQ: tapez vignette("datatable-faq", package="data.table") ou trouvez-le en ligne .

27
Chase

Comme un data.table est un data.frame, vous pouvez utiliser l'agrégat pour cela:

> aggregate(. ~ ID, data=x, FUN=sum)
    ID Count1 Count2 Count3
1  210     13      5      5
2 3917      5      5      5
11
Matthew Lundberg