web-dev-qa-db-ja.com

複数の列を一度に集約する

私は次のようなデータフレームを持っています:

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

また、上記の同じステートメントの手段として出力される列の名前を変更するにはどうすればよいですか

27
Rookie

aggregateの数式メソッドを使用できます。 ~の 'rhs'の変数はグループ化変数であり、.は 'df1'の他のすべての変数を表します(この例では、meanグループ化を除くすべての列)、データセットと関数(mean)を指定します。

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

または、グループ化後にdplyrsummarise_eachを使用できます(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"))
40
akrun

あなたが試すことができます:

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