微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何根据另一列定义的组计算一列的排名?

如何解决如何根据另一列定义的组计算一列的排名?

| Windows 7上的R版本2.11.1 32位 我得到如下数据集:
USER_A USER_B score
1        6      0.2
1        7      0.1
1        10     0.15
2        6      0.2
2        9      0.12
3        8      0.15
3        9      0.3
USER_A是1:3,而USER_B是6:10。现在,我需要输出按他们的score排序的USER_B和USER_B:
USER_A      ranking of USER_B
1  3  1  2  #the ranking of USER_B 6,7,10(which belong to USER_A 1)
2  2  1     #the ranking of USER_B 6,9(which belong to USER_A 2)
3  1  2     #the ranking of USER_B 8,9(which belong to USER_A 3)
实际上,我只需要输出排名:
3 1 2
2 1
1 2
这很烦人,因为每一行的长度都不一样!我无法将它们存储在矩阵中然后输出。 谁能帮我解决这个问题?     

解决方法

df <- read.table(con <- textConnection(\"USER_A USER_B SCORE
1        6      0.2
1        7      0.1
1        10     0.15
2        6      0.2
2        9      0.12
3        8      0.15
3        9      0.3
\"),header = TRUE)
close(con)
一种方法是拆分数据:
sdf <- with(df,split(SCORE,f = USER_A))
lapply(sdf,rank)
最后一行给出:
> lapply(sdf,rank)
$`1`
[1] 3 1 2

$`2`
[1] 2 1

$`3`
[1] 1 2
一种替代方法是使用
aggregate()
,如下所示:
aggregate(SCORE ~ USER_A,data = df,rank)
哪个返回:
> (foo <- aggregate(SCORE ~ USER_A,rank))
  USER_A   SCORE
1      1 3,1,2
2      2    2,1
3      3    1,2
但是这里的输出有些不同,现在我们有了一个数据帧,第二个组件“ 9”是一个列表,就像输出的“ 10”版本一样:
> str(foo)
\'data.frame\':   3 obs. of  2 variables:
 $ USER_A: int  1 2 3
 $ SCORE :List of 3
  ..$ 0: num  3 1 2
  ..$ 1: num  2 1
  ..$ 2: num  1 2
> foo$SCORE
$`0`
[1] 3 1 2

$`1`
[1] 2 1

$`2`
[1] 1 2
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。