Повторное ранжирование на основе оригинальных и специфических для строки новых значений - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть набор данных, подобный следующему:

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, которое является всего лишь 30% -ым увеличением Ln, то есть round(exp(0.1*a$Ht^0.1*((a$Ln)*1.30)^0.05),3).Мне нравится получать новое ранжирование, основанное на измененном значении этой строки, оставляя все остальные строки неизменными (т.е. сохраняя то же самое, что и оригинал).Например, для строки 2 значение Pr30 будет равно 1,117, его ранжирование будет равно 6 (значение rank30) вместо 7 (значение rank0) по сравнению с остальными значениями Pr0.Вот два примера:

Row1: 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.

Row2: 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 .

1 Ответ

0 голосов
/ 21 сентября 2018

Вы можете написать функцию:

  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
...