我正在尝试按人口和日期排序此数据框,因此我使用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技巧?
答案 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