我如何用R rank()函数创建一个新的tie.method?

时间:2010-07-07 19:09:53

标签: sorting select r ranking dataframe

我正在尝试按人口和日期排序此数据框,因此我使用order()rank()函数:

> df <- data.frame(idgeoville = c(5, 8, 4, 3, 4, 5, 8, 8),
                   date       = c(rep(1950, 4), rep(2000, 4)),
                   population = c(500, 450, 350, 350, 650, 500, 500, 450))
> df
   idgeoville date    population
1  5          1950     500
2  8          1950     450
3  4          1950     350
4  3          1950     350
5  4          2000     650
6  5          2000     500
7  8          2000     500
8  8          2000     450

使用ties.method = "first"我没有问题,最后我正在制作这个数据帧:

   idgeoville date    population  rank
1  5          1950     500        1
2  8          1950     450        2
3  4          1950     350        3
4  3          1950     350        4
5  4          2000     650        1
6  5          2000     500        2
7  8          2000     500        3
8  8          2000     450        4

但实际上,我想要一个数据框,其中相等的人口等级排名,如下所示:

   idgeoville date    population  rank
1  5          1950     500        1
2  8          1950     450        2
3  4          1950     350        3
4  3          1950     350        3
5  4          2000     650        1
6  5          2000     500        2
7  8          2000     500        2
8  8          2000     450        3

如何用R解决此问题?使用自定义ties.method()或其他R技巧?

3 个答案:

答案 0 :(得分:6)

更简单的方法:

pop.rank <- as.numeric(factor(population))

答案 1 :(得分:4)

我认为没有选择以等级来做;这是一个自定义函数,可以执行您想要的操作,但如果您的数据很大,它可能会太慢:

Rank<-function(d) {
    j<-unique(rev(sort(d)));
    return(sapply(d,function(dd) which(dd==j)));
}

答案 2 :(得分:1)

这回答了一个稍微不同的问题,即如何基于多个列对data.frame对象进行排序。为此,您可以使用包sort_df中的函数reshape

> library(reshape)
> sort_df(df,vars=c('date','population'))
  idgeoville date population
3          4 1950        350
4          3 1950        350
2          8 1950        450
1          5 1950        500
8          8 2000        450
6          5 2000        500
7          8 2000        500
5          4 2000        650