根据个人用户排名

时间:2014-08-05 17:13:39

标签: r

我的数据集如下所示:

User              Area        
Sarah             123.4
Sarah             20.5
Sarah             43
Sam               86
Sam               101
Sam               32.6
Justin            45
Justin            125.8
Justin            39
Justin            88.4
Zac               21
Zac               4
Zac               111

我想将最大区域排序为最小区域,但我希望每个用户都有单独的顶部区域。

我尝试过:测试$ Ranking1< - order(测试$ User,测试$ Area,减去= FALSE),但这会将它们全部排在一起 然后我尝试:测试$ Ranking1< - ave(测试$ User,测试$ Area,FUN = rank),而其他人似乎已经说过这将起作用我的输出/结果给中间(平均)值排名1然后上升最接近平均值。我是1而不是平均水平的最大区域。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

使用data.table

可以非常轻松地完成此操作
library(data.table)                 # Load package
setDT(dat)                          # convert to data.table
dat[,max(Area),by=User]             # compute

dat[,sort(Area),by=User]                     # Sort increasing
dat[,sort(Area,decreasing = T),by=User]      # Sort decreasing

希望这有帮助! 阅读包的文档,这非常有帮助。

答案 1 :(得分:1)

我假设您希望在每个人中排名area,并且还想知道每个人的最大区域:

## make up data
set.seed(1)
user <- rep(LETTERS[sample(26, 5)], each=sample(5, 1))
area <- rnorm(length(user), 100, 20)
d <- data.frame(user, area)

library(dplyr)
d %>% 
  group_by(user) %>%
  mutate(ranking=rank(-area), top_area=max(area)) %>%
  ungroup()

   user      area ranking top_area
1     G 131.90562       1 131.9056
2     G 106.59016       4 131.9056
3     G  83.59063       5 131.9056
4     G 109.74858       3 131.9056
5     G 114.76649       2 131.9056
6     J 111.51563       2 130.2356
7     J  93.89223       4 130.2356
8     J 130.23562       1 130.2356
9     J 107.79686       3 130.2356
10    J  87.57519       5 130.2356
...

答案 2 :(得分:0)

我认为这是你想要的输出?如果您希望订单反转,请在rev()函数周围包裹rank()

x = "User              Area        
     Sarah             123.4
     Sarah             20.5
     Sarah             43
     Sam               86
     Sam               101
     Sam               32.6
     Justin            45
     Justin            125.8
     Justin            39
     Justin            88.4
     Zac               21
     Zac               4
     Zac               111"

rank.foo = function(x) {
  z = numeric()
  for (i in as.character(unique(x$User)))
  {z = c(z, rank(subset(x, User == i)$Area))}
  return(z)
}

cbind(df, rank.foo(df))

     User  Area rank.foo(df)
    Sarah 123.4            3
    Sarah  20.5            1
    Sarah  43.0            2
      Sam  86.0            2
      Sam 101.0            3
      Sam  32.6            1
   Justin  45.0            2
   Justin 125.8            4
   Justin  39.0            1
   Justin  88.4            3
      Zac  21.0            2
      Zac   4.0            1
      Zac 111.0            3