我有一张看起来像这样的表
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对的前五个分数的平均值。
答案 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'])