根据原始值和行特定的新值进行重新排名

时间:2018-09-21 03:48:04

标签: r dplyr rank

我有一个类似以下的数据集:

a <- structure(list(CSECT = c("001-01", "001-02", "001-03", "001-04", "001-05", "001-06", "001-07", "001-08", "001-09", "001-10"), 
Ht = c(0.341, 0.1244, 0.3, 0.143, 1.265, 0.143, 0.553, 0.132, 2.221, 1.444), 
Ln= c(11, 351, 454, 15, 1446, 138, 9442, 354, 354, 4566)),
.Names = c("CSECT", "Ht", "Ln"), row.names = c(NA, -10L), class = "data.frame")
a$Pr0 <- round(exp(0.1*a$Ht^0.1*a$Ln^0.05),3)
a
    CSECT     Ht   Ln   Pr0
1  001-01 0.3410   11 1.107
2  001-02 0.1244  351 1.115
3  001-03 0.3000  454 1.128
4  001-04 0.1430   15 1.099
5  001-05 1.2650 1446 1.159
6  001-06 0.1430  138 1.111
7  001-07 0.5530 9442 1.161
8  001-08 0.1320  354 1.116
9  001-09 2.2210  354 1.156
10 001-10 1.4440 4566 1.171

我想基于Pred0 [ties.method=min]对行进行排名。

ab1 <- a %>%
    mutate(rank0 = rank(desc(Pr0), ties.method="min"))
ab1
    CSECT     Ht   Ln   Pr0 rank0
1  001-01 0.3410   11 1.107     9
2  001-02 0.1244  351 1.115     7
3  001-03 0.3000  454 1.128     5
4  001-04 0.1430   15 1.099    10
5  001-05 1.2650 1446 1.159     3
6  001-06 0.1430  138 1.111     8
7  001-07 0.5530 9442 1.161     2
8  001-08 0.1320  354 1.116     6
9  001-09 2.2210  354 1.156     4
10 001-10 1.4440 4566 1.171     1

我想基于名为Pr30的新预测值对行进行排名,这不过是Lnround(exp(0.1*a$Ht^0.1*((a$Ln)*1.30)^0.05),3)的30%的增加。我喜欢通过保持所有其他行不变(即保持与原始行相同)来基于该行的更改值来获得新的排名。例如,对于第2行,Pr30将是1.117,与其余rank30相比,其排名将是6(rank0值)而不是7(Pr0值)价值观。这是两个示例:

  

第1行:round(exp(0.1*0.3410 ^0.1*(11*1.30)^0.05),3)=1.108;仅作为   此行将增加30%,其他行均相同。 Pr值将   看起来像(1.108,1.115、1.128、1.099、1.159、1.111、1.161、1.116,   1.156、1.171)。需要应用排名功能。对于row1,它仍然是9。

     

第2行:round(exp(0.1*0.1244 ^0.1*(351*1.30)^0.05),3)=1.117;仅作为   此行将增加30%,其他行均相同。 Pr值将   看起来像(1.107,1.117,1.128,1.099,1.159,1.111,1.161,1.116,   1.156、1.171)。需要应用排名功能。对于row2,排名已变为6。

所有行都会发生类似的情况。最终值将如下所示:

    CSECT     Ht   Ln   Pr0 rank0 rank30
1  001-01 0.3410   11 1.107     9      9
2  001-02 0.1244  351 1.115     7      6
3  001-03 0.3000  454 1.128     5      5
4  001-04 0.1430   15 1.099    10     10
5  001-05 1.2650 1446 1.159     3      2
6  001-06 0.1430  138 1.111     8      8
7  001-07 0.5530 9442 1.161     2      2
8  001-08 0.1320  354 1.116     6      6
9  001-09 2.2210  354 1.156     4      3
10 001-10 1.4440 4566 1.171     1      1

支持google spreadsheet

1 个答案:

答案 0 :(得分:0)

您可以编写一个函数:

  fun =function(x,y){
      y[x]=  round(exp(0.1*a$Ht[x]^0.1*(a$Ln[x]*1.30)^0.05),3)
      rank(-y,ties.method = 'first')[x]
    }

 transform(a,rank1 = rank(-Pr0),rank2 = sapply(seq_along(Pr0),fun,Pr0))
    CSECT     Ht   Ln   Pr0 rank1 rank2
1  001-01 0.3410   11 1.107     9     9
2  001-02 0.1244  351 1.115     7     6
3  001-03 0.3000  454 1.128     5     5
4  001-04 0.1430   15 1.099    10    10
5  001-05 1.2650 1446 1.159     3     2
6  001-06 0.1430  138 1.111     8     8
7  001-07 0.5530 9442 1.161     2     2
8  001-08 0.1320  354 1.116     6     6
9  001-09 2.2210  354 1.156     4     4
10 001-10 1.4440 4566 1.171     1     1