首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用两个变量对最低分进行分组

用两个变量对最低分进行分组
EN

Stack Overflow用户
提问于 2012-05-12 09:56:13
回答 3查看 72关注 0票数 2

我有一张像这样的桌子

代码语言:javascript
复制
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更适合的分析。

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

代码语言:javascript
复制
uid gid top5avg
1   a   4.3
1   b   5.7
2   a   3.5
2   b   6.8
.
.
.

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-12 10:17:30

如果你的数据被称为dat,这将会起作用:

代码语言:javascript
复制
aggregate(score~uid+gid, data=dat, function(x) mean(sort(x)[1:5]))

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

代码语言:javascript
复制
aggregate(score~uid+gid, data=dat, function(x) mean(rev(sort(x))[1:5]))

或者使用乔兰提出的tail建议。

票数 2
EN

Stack Overflow用户

发布于 2012-05-12 10:13:43

这在R中甚至更微不足道,假设您的数据框名为dat,并且您实际上是指后5个分数(即使您的示例建议了前5个分数):

代码语言:javascript
复制
library(plyr)
ddply(dat,.(uid,gid),summarise,bottom5avg = mean(tail(sort(score),5)))

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

票数 3
EN

Stack Overflow用户

发布于 2013-10-17 20:19:26

data.table解决方案

代码语言:javascript
复制
library(data.table)
setkey(dat,uid,gid,score)
sol <- dat[,list(avg5 = mean(tail(score,5)),by='uid,gid'])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10560437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档