通过两个变量对底部分数进行分组

时间:2012-05-12 01:56:13

标签: r

我有一张看起来像这样的表

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对的前五个分数的平均值。

3 个答案:

答案 0 :(得分:3)

这在R中更为微不足道,假设您的数据框被称为dat而您真正意味着最低5分(即使您的示例显示前5名):

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

请注意,此代码假定每组中至少有5个观察值。

答案 1 :(得分: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]))

或者使用Joran提出的tail建议。

答案 2 :(得分:1)

data.table解决方案

library(data.table)
setkey(dat,uid,gid,score)
sol <- dat[,list(avg5 = mean(tail(score,5)),by='uid,gid'])