我有一个类似以下的数据集:
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
的新预测值对行进行排名,这不过是Ln
即round(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
答案 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