1

aggregateで関数を使おうとしていますがcbind、何かが足りないに違いありません。

複数の集計に集計を使用する」で、修正する列と追加する列を簡単に定義できることを確認しましたが、期待した結果が得られません。

私は持っています:

x <- data.frame(alfa = 1:9, beta = rep(1:3, 3))

  alfa beta
1    1    1
2    2    2
3    3    3
4    4    1
5    5    2
6    6    3
7    7    1
8    8    2
9    9    3

そして、ベータ列のエントリによって集計されたエントリの平均を取得したいと思います。そのために私は試しました:

aggregate(cbind(alfa) ~ beta, data = x, FUN = function(x) c(gama = mean(x)) )

それは私に与えます:

  beta alfa
1    1    4
2    2    5
3    3    6

結果は次のようになりません。

  alfa beta gama
1    1    1    4
2    2    2    5
3    3    3    6

カラムガマの追加を強制するにはどうすればよいですか?さらに、誰かが機能の基礎を明確にしcbind()ますか?私はそれを理解するのに苦労してきました。よろしく!

4

1 に答える 1

6

Aggregateは、の左側にあるすべての要素を取得し、~それらの値に対して指定された関数を使用しますが、右側の値によってグループ化されます。したがって、あなたのコマンド

aggregate(alfa ~ beta, data=x, mean)

alfaでグループ化されたの平均値を返しますbeta。(SQLについて述べたように、これはSQL句で発生するのと同じですSELECT beta, avg(alfa) FROM x GROUP BY beta

最初に検出された値を出力する場合、これは基本的に実行する別の集計であるため、集計関数は2つの値を返す必要があります。

aggregate(alfa ~ beta, data=x, function(x) c(alfa=x[1], gamma=mean(x)))

(SQLでもSELECT beta, min(alfa), avg(alfa) FROM x GROUP BY beta:)

あなたはについて尋ねましたcbind。左側に引数が1つしかない限り、これはまったく問題ではありません。ただし、次のような状況があるとします。

x <- data.frame(alfa = 1:9, beta = rep(1:3, 3), gamma = rnorm(9))

alfaたとえば、列との両方の平均を計算したい場合は、次のgammaように実行できます。

aggregate(cbind(alfa, gamma) ~ beta, data=x, function(x) mean(x))

alfaこのようにして、指定された関数でthrowとgamma両方を使用するように集計関数に指示するだけです。

より詳細な例については、を参照してください?aggregate


編集

の異なる意味を混同しないように注意する必要がありcbindます。別の関数を使用して、同じ長さの2つのベクトル(またはdata.frames)を、両方の入力を異なる列として持つ行列(またはdata.frame)に連結します。

> cbind(1:3, 7:9)
     [,1] [,2]
[1,]    1    7
[2,]    2    8
[3,]    3    9

集計の式表記で使用されると、cbind関連はありますが、それでも異なります。両方の行で指定された関数を別々に使用するようにaggregatecbind(column1, column2)に指示するだけです。したがって、

aggregate(cbind(alfa, gamma) ~ beta, data=x, function(x) mean(x[,1]*x[,2]))

動作しませ。むしろ、関数は2回呼び出されます。1回はの値でalfa、次に。の値で呼び出されますbeta

それがあなたの理解を明らかにすることを願っています。

于 2012-11-29T19:32:59.770 に答える