R 使い方 集計に便利な関数 aggregate

バイオインフォ道場、くまぞうです。

データフレームを使って集計を行う場合に、使いやすい関数があります。aggregate関数です。データフレームの計算にはapply系の関数がよく使われますが、わかりづらいという方にはオススメの方法です。

スポンサーリンク



aggregate関数の使い方

aggregate関数は、データフレームについて「指定した列をカテゴリで分けて集計する」というような計算を行うことができます。引数に、集計したい列(群)・識別したい条件(群)・関数を指定します。

単純構造

構造が単純な場合は、table関数でも同様のことができます。

R> df <- data.frame(name = c("a","a","b","b","b","c","c","c","c"))
  name
1    a
2    a
3    b
4    b
5    b
6    c
7    c
8    c
9    c

R> table(df)
df
a b c 
2 3 4 

R> aggregate(df, by=list(df$name), length)
  Group.1 name
1       a    2
2       b    3
3       c    4

カテゴリ毎に集計する

データフレームの列が多い場合はaggregate関数を使ったほうが便利です。集計したい列(x)、カテゴリなどの分けたい条件(by)、計算に使いたい関数(FUN)を指定します。

R> df <- data.frame(name = c("a","a","b","b","b","c","c","c","c"),
                    val1 = c(0, 1, 1, 2, 3, 5, 8, 13, 21),
                    val2 = c(1, 2, 3, 4, 5, 6, 7,  8,  9))
R> df
  name val1 val2
1    a    0    1
2    a    1    2
3    b    1    3
4    b    2    4
5    b    3    5
6    c    5    6
7    c    8    7
8    c   13    8
9    c   21    9

R> aggregate(x=df[c("val1")], by=list(df$name), FUN=sum) # val1のみ集計
  Group.1 val1
1       a    1
2       b    6
3       c   47

R> aggregate(x=df[c("val1","val2")], by=list(df$name), sum) # val1,2について
  Group.1 val1 val2
1       a    1    3
2       b    6   12
3       c   47   30

便利な使い方

集計したい列や、分けたい条件は複数指定することができます。

R> df <- data.frame(name = c("a","a","b","b","b","c","c","c","c"),
	            type = c("A","A","A","A","B","B","B","B","B"),
                    val1 = c(0, 1, 1, 2, 3, 5, 8, 13, 21),
                    val2 = c(1, 2, 3, 4, 5, 6, 7,  8,  9))
R> df
  name type val1 val2
1    a    A    0    1
2    a    A    1    2
3    b    A    1    3
4    b    A    2    4
5    b    B    3    5
6    c    B    5    6
7    c    B    8    7
8    c    B   13    8
9    c    B   21    9

R> aggregate(x=df[c("val1","val2")], by=list(df$name,df$type), sum) # 複数条件
  Group.1 Group.2 val1 val2
1       a       A    1    3
2       b       A    3    7
3       b       B    3    5
4       c       B   47   30

# データセット irisでSpecies毎にmaxを計算
R> iris
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.1         3.5          1.4         0.2     setosa
2            4.9         3.0          1.4         0.2     setosa
3            4.7         3.2          1.3         0.2     setosa
4            4.6         3.1          1.5         0.2     setosa
5            5.0         3.6          1.4         0.2     setosa
...

R> aggregate(x=iris[-5], by=list(species=iris$Species), FUN=max)
     species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa          5.8         4.4          1.9         0.6
2 versicolor          7.0         3.4          5.1         1.8
3  virginica          7.9         3.8          6.9         2.5

よく使われるapply系関数

apply系関数を指定して集計した場合

apply関数とtapply関数を組み合わせて、同様の集計を行ってみました。

R> apply(iris[-5], 2, function(x){tapply(x, iris$Species, max)})
           Sepal.Length Sepal.Width Petal.Length Petal.Width
setosa              5.8         4.4          1.9         0.6
versicolor          7.0         3.4          5.1         1.8
virginica           7.9         3.8          6.9         2.5
スポンサーリンク