Совокупность нескольких столбцов одновременно

У меня есть привязка к кадрам данных:

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

Я хочу объединить вышеперечисленное с помощью id1 & id2. Я хочу иметь возможность получать средства для val1, val2, val3, val4 одновременно.

Как мне это сделать?

Это то, что у меня есть, но оно работает только для 1 колонки:

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

Кроме того, как мне переименовать столбцы, которые выводятся как средства в том же самом заявлении, приведенном выше

Ответ 1

Мы можем использовать формульный метод aggregate. Переменные в "rhs" of ~ являются переменными группировки, а . представляет все остальные переменные в 'df1' (из примера мы предполагаем, что нам нужно mean для всех столбцов, кроме группировки), укажите набор данных и функцию (mean).

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

Или мы можем использовать summarise_each из dplyr после группировки (group_by)

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

Или другой вариант - data.table. Мы преобразуем 'data.frame' в 'data.table' (setDT(df1), сгруппированные по 'id1' и 'id2', мы проделываем подмножество data.table(.SD) и получаем 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"))

Ответ 2

Вы можете попробовать:

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