Ik heb een dataframe zoals:
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
Ik wil het bovenstaande samenvoegen door id1 & id2. Ik wil de middelen voor val1, val2, val3, val4 tegelijkertijd kunnen krijgen.
Hoe doe ik dit?
Dit is wat ik momenteel heb, maar het werkt maar voor 1 kolom:
agg <- aggregate(x$val1, list(id11 = x$id1, id2= x$id2), mean)
names(agg)[3] <- c("val1") # Rename the column
Ook, hoe hernoem ik de kolommen die worden uitgevoerd als middelen in dezelfde verklaring hierboven gegeven
Antwoord 1, autoriteit 100%
We kunnen de formulemethode van aggregate
gebruiken. De variabelen op de ‘rhs’ van ~
zijn de groeperingsvariabelen terwijl de .
alle andere variabelen in de ‘df1’ vertegenwoordigt (van het voorbeeld nemen we aan dat we de mean
voor alle kolommen behalve de groepering), specificeer de dataset en de functie (mean
).
aggregate(.~id1+id2, df1, mean)
Of we kunnen summarise_each
van dplyr
gebruiken na het groeperen (group_by
)
library(dplyr)
df1 %>%
group_by(id1, id2) %>%
summarise_each(funs(mean))
Of gebruik summarise
met across
(dplyr
devel-versie – ‘0.8.99.9000’
)
df1 %>%
group_by(id1, id2) %>%
summarise(across(starts_with('val'), mean))
Of een andere optie is data.table
. We converteren de ‘data.frame’ naar ‘data.table’ (setDT(df1)
, gegroepeerd op ‘id1’ en ‘id2’, we doorlopen de subset van data.table (.SD
) en krijg het mean
.
library(data.table)
setDT(df1)[, lapply(.SD, mean), by = .(id1, id2)]
gegevens
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"))
Antwoord 2, autoriteit 38%
Je zou kunnen proberen:
agg <- aggregate(list(x$val1, x$val2, x$val3, x$val4), by = list(x$id1, x$id2), mean)