基于两个变量的排名

时间:2017-03-15 11:09:33

标签: r sorting ranking rank

我需要根据两个变量对行进行排名,而我无法绕过它。

以下测试数据:

df <- data.frame(A = c(12,35,55,7,6,NA,NA,NA,NA,NA), B = c(NA,12,25,53,12,2,66,45,69,43))

A  B
12 NA
35 12
55 25
7  53
6  12
NA 2
NA 66
NA 45
NA 69
NA 43

我想计算第三个变量,当A!= NA时,C等于A.当A == NA然后C == B时,但是C得分应始终遵循A == NA的行应该永远不会超过A!= NA的行。

在上面的数据中,Max(A)应该等于max(C),max(B)只能保持第六个最高的C值,因为A有五个非NA值。如果A == NA且B超出A!= NA的行,则应进行某种形式的转换,以确保A!= NA行总是超出最终C得分中的B行

我希望结果看起来像这样:

A  B  C 
55 25 1
35 12 2  
12 NA 3 
7  53 4
6  12 5
NA 69 6
NA 66 7
NA 45 8
NA 43 9
NA 2  10

到目前为止,我能得到的最接近的是

df$C <- ifelse(is.na(df$A), min(df$A, na.rm=T)/df$B, df$A)

但是当A == NA时,排名会颠倒,所以B == 2排名为6而不是B == 69

A  B  C 
55 25 1
35 12 2  
12 NA 3 
7  53 4
6  12 5
NA 2  6
NA 43 7
NA 45 8
NA 66 9
NA 69 10 

我不确定我是否可以使用某种重量?

非常感谢任何建议!谢谢!

1 个答案:

答案 0 :(得分:0)

您可以尝试:

 df$C <- order(-df$A)
 df[is.na(df$A),"C"] <- sort.list(order(-df[is.na(df$A),"B"]))+length(which(!is.na(df$A)))

和C的顺序:

df[order(df$C),]