2

私はこのようなテーブルを持っています

uid gid score
1   a   5
1   a   8
1   a   9
1   b   2
1   b   7
2   a   5
2   a   9
.
.
.

ただし、各ユーザーおよびグループにはさらに多くのエントリがあります。

下位 5 つのスコアの平均である各 uid/gid ペアの行を持つテーブルを取得したいと考えています。

これは、ピボット テーブルを使用する Excel では簡単なことでしたが、R の方がはるかに適している分析を行う必要があります。

だから私は私の結果が次のようになりたい

uid gid top5avg
1   a   4.3
1   b   5.7
2   a   3.5
2   b   6.8
.
.
.

uid/gid ペアごとに 1 つの行が表示され、その uid/gid ペアの上位 5 つのスコアの平均が表示されます。

4

3 に答える 3

3

datこれは、データ フレームが呼び出され、実際に下位 5 のスコアを意味していると仮定すると (例では上位 5 を示唆していますが)、R ではさらに簡単です。

library(plyr)
ddply(dat,.(uid,gid),summarise,bottom5avg = mean(tail(sort(score),5)))

このコードは、各グループに少なくとも 5 つの観測があることを想定していることに注意してください。

于 2012-05-12T02:13:42.567 に答える
2

データが dat と呼ばれる場合、これは機能します。

aggregate(score~uid+gid, data=dat, function(x) mean(sort(x)[1:5]))

編集: Joranが示したように(私も混乱していました)、私が持っていたものとは反対(下の5)を意味する場合は、次のように使用revします:

aggregate(score~uid+gid, data=dat, function(x) mean(rev(sort(x))[1:5]))

または、tailジョランが行った提案を使用してください。

于 2012-05-12T02:17:29.870 に答える
1

そしてdata.table解決策

library(data.table)
setkey(dat,uid,gid,score)
sol <- dat[,list(avg5 = mean(tail(score,5)),by='uid,gid'])
于 2013-10-17T12:19:26.470 に答える