假设我在R中有一个数据帧:
d=data.frame(x=c(0,20,0,12,0,73),y=c(22,0,32,0,5,0))
d
x y
1 0 22
2 20 0
3 0 32
4 12 0
5 0 5
6 73 0现在我想创建另一个列rank,它的值为1表示y的最小正值,2表示y的第二小正值,3表示y的第三小正值,4表示x的最小正值,5表示x的第二小正值,6表示x的第三小正值。这就是我想要的输出:
d
x y rank
1 0 22 2
2 20 0 5
3 0 32 3
4 12 0 4
5 0 5 1
6 73 0 6我该怎么做呢?
发布于 2017-03-15 09:33:24
当x=0时按y排序,当y=0与先按x排序,然后按y排序时,再按x排序,因此您可以使用order按x排序,然后按y排序,并按此顺序分配排名:
d[order(d$x,d$y),"rank"] <- 1:dim(d)[1]
x y rank
1 0 22 2
2 20 0 5
3 0 32 3
4 12 0 4
5 0 5 1
6 73 0 6发布于 2017-03-15 09:59:02
或者,修改后的选项是在order输出上调用order
d$rank <- order(do.call(order, d))
d
# x y rank
#1 0 22 2
#2 20 0 5
#3 0 32 3
#4 12 0 4
#5 0 5 1
#6 73 0 6https://stackoverflow.com/questions/42799464
复制相似问题