web-dev-qa-db-fra.com

Agréger plusieurs colonnes à la fois

J'ai un liko de trame de données:

x <-
id1 id2    val1  val2 val3 val4
1   a   x    1    9
2   a   x    2    4
3   a   y    3    5
4   a   y    4    9
5   b   x    1    7
6   b   y    4    4
7   b   x    3    9
8   b   y    2    8

Je souhaite agréger ce qui précède par id1 & id2. Je veux pouvoir obtenir les moyennes pour val1, val2, val3, val4 en même temps.

Comment puis-je faire cela?

C'est ce que j'ai actuellement, mais cela ne fonctionne que pour 1 colonne:

agg <- aggregate(x$val1, list(id11 = x$id1, id2= x$id2), mean)
names(agg)[3] <- c("val1")  # Rename the column

Aussi, comment puis-je renommer les colonnes qui sont sorties en tant que moyen dans la même déclaration donnée ci-dessus

27
Rookie

Nous pouvons utiliser la méthode de la formule aggregate. Les variables sur les 'rhs' de ~ Sont les variables de regroupement, tandis que le . Représente toutes les autres variables du 'df1' (dans l'exemple, nous supposons que nous avons besoin de mean pour toutes les colonnes sauf le groupement), spécifiez le jeu de données et la fonction (mean).

aggregate(.~id1+id2, df1, mean)

Ou nous pouvons utiliser summarise_each À partir de dplyr après le regroupement (group_by)

library(dplyr)
df1 %>%
    group_by(id1, id2) %>% 
    summarise_each(funs(mean))

Ou une autre option est data.table. Nous convertissons le 'data.frame' en 'data.table' (setDT(df1), groupé par 'id1' et 'id2'), nous parcourons le sous-ensemble de data.table (.SD) et obtenez le mean.

library(data.table)
setDT(df1)[, lapply(.SD, mean), by = .(id1, id2)] 

les données

df1 <- structure(list(id1 = c("a", "a", "a", "a", "b", "b", 
"b", "b"
), id2 = c("x", "x", "y", "y", "x", "y", "x", "y"), 
val1 = c(1L, 
2L, 3L, 4L, 1L, 4L, 3L, 2L), val2 = c(9L, 4L, 5L, 9L, 7L, 4L, 
9L, 8L)), .Names = c("id1", "id2", "val1", "val2"), 
class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8"))
40
akrun

Tu pourrais essayer:

agg <- aggregate(list(x$val1, x$val2, x$val3, x$val4), by = list(x$id1, x$id2), mean)
11
Filipe Mencarini