如何解决如何根据另一列定义的组计算一列的排名?
| 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 举报,一经查实,本站将立刻删除。