Meerdere kolommen tegelijk samenvoegen

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 aggregategebruiken. 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 meanvoor alle kolommen behalve de groepering), specificeer de dataset en de functie (mean).

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

Of we kunnen summarise_eachvan dplyrgebruiken na het groeperen (group_by)

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

Of gebruik summarisemet across(dplyrdevel-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)

Other episodes