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
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)]
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"))
Tu pourrais essayer:
agg <- aggregate(list(x$val1, x$val2, x$val3, x$val4), by = list(x$id1, x$id2), mean)