【问题标题】:How to calculate ranking of one column based on groups defined by another column?如何根据另一列定义的组计算一列的排名?
【发布时间】:2011-08-04 15:51:39
【问题描述】:

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_A 和 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

因为每一行的长度不同,所以很不爽!我无法将它们存储在矩阵中然后输出。

谁能帮我解决这个问题?

【问题讨论】:

  • 非常糟糕的标题 - 请为您的问题使用更合适的标题!
  • 我认为您需要开始整理您今天获得的各种答案,并亲自尝试。我自己和其他几个人提供了多种方法,您可以将数据拆分为块,将函数应用于这些块,然后重新组合结果。这些方法对这个 Q 的推广与对所有其他方法的推广一样多。
  • @Joris - 谢谢,好多了! :-)

标签: r algorithm statistics dataset


【解决方案1】:
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, data = df, rank))
  USER_A   SCORE
1      1 3, 1, 2
2      2    2, 1
3      3    1, 2

但是这里的输出有点不同,现在我们有一个数据框,第二个组件SCORE 是一个列表,就像输出的lapply() 版本一样:

> 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

【讨论】:

  • 那么如何把它放到我的电脑上呢?我尝试 write.table(),但失败了。
  • @user677743 你想在哪里使用结果?您希望数据以什么格式输出?
猜你喜欢
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 2022-11-23
  • 2022-01-23
相关资源
最近更新 更多