我有一张像这样的桌子
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对的前五个分数的平均值。
发布于 2012-05-12 10:17:30
如果你的数据被称为dat,这将会起作用:
aggregate(score~uid+gid, data=dat, function(x) mean(sort(x)[1:5]))编辑:如果你的意思与我的相反(底部5),正如乔兰所指出的(我也很困惑),那么使用rev,如下所示:
aggregate(score~uid+gid, data=dat, function(x) mean(rev(sort(x))[1:5]))或者使用乔兰提出的tail建议。
发布于 2012-05-12 10:13:43
这在R中甚至更微不足道,假设您的数据框名为dat,并且您实际上是指后5个分数(即使您的示例建议了前5个分数):
library(plyr)
ddply(dat,.(uid,gid),summarise,bottom5avg = mean(tail(sort(score),5)))请注意,此代码假设每组中至少有5个观察值。
发布于 2013-10-17 20:19:26
和data.table解决方案
library(data.table)
setkey(dat,uid,gid,score)
sol <- dat[,list(avg5 = mean(tail(score,5)),by='uid,gid'])https://stackoverflow.com/questions/10560437
复制相似问题