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
.
.
.

但是每个用户和组都有更多条目。

我想得到一个表格,其中每个 uid/gid 配对都有一行,这是他们最低 5 分的平均值。

这在使用数据透视表的 Excel 中是微不足道的,但我需要做一些 R 更适合的分析。

所以我希望我的结果看起来像

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

每个 uid gid 对有一行,然后是该 uid/gid 对的前五个分数的平均值。

4

3 回答 3

3

这在 R 中更加微不足道,假设您的数据框被调用dat并且您的真正意思是最低 5 分(即使您的示例建议前 5 位):

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]))

编辑: 如果你的意思与我所拥有的相反(底部 5),正如 Joran 所指出的(我也很困惑),那么使用rev如下:

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

或者使用tailJoran 提出的建议。

于 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 回答