обновить значения столбца путем поиска значения из другой таблицы - PullRequest
0 голосов
/ 28 августа 2018

Итак, я хочу найти значение ScoreLU на основе таблицы df. Например, значение 1.3730682 в DSCRpd должно возвращать значение ScoreLU, равное 60, поскольку оно больше 1,35, но меньше следующего значения 1,65.

С другой стороны, для столбца «Кредитное плечо» он должен быть в порядке Desc, т. Е. Первое значение 2,01 должно возвращать значение 60, поскольку оно меньше 2,5, но больше следующего значения 2,0.

[df][1]
   DSCRpd Leverage         TCB
1  1.3730682 2.010122 -1590099.11
2  1.0449597 2.680051   493370.85
3  1.0311141 4.790531    21594.63
4  1.3923007 3.279903  -499326.76
5  1.6443938 3.853003   988780.79
6  0.6265976 1.814359  1003736.73
7  2.1025253 4.412528  1245305.83
8  1.2872873 2.074424  -688305.83
9  0.5088294 2.504510  1406986.68
10 1.7794307 3.724905  1132513.33


[ScoreLU][2]
      Score DSCRpd Leverage     TCB
 1:       0   0.65      5.0       0
 2:      10   0.80      4.5  100000
 3:      20   0.95      4.0  250000
 4:      30   1.10      3.5  500000
 5:      40   1.20      3.0  850000
 6:      50   1.26      2.5 1250000
 7:      60   1.35      2.0 1700000
 8:      70   1.65      1.5 2300000
 9:      80   2.00      1.0 2900000
10:      90   2.30      0.5 3600000

Да, точно так же, как функция vlookup в Excel с возможностью заказа Asc и Desc. Помощь.

У меня есть функция, которая может правильно определить значение ... но как использовать ее в каждом столбце для заполнения значения в соответствующем столбце, т. Е. Для оценки DSCRpd результат должен быть обновлен до столбца с именем DSCRpdScore.

Эта функция просматривает фрейм данных 'df' с номером столбца CN и возвращает соответствующее значение на основе x.

myFUN = function(df, x, CN){
if (dtScoreLU[1,CN] <= median(dtScoreLU[,CN])){
    myMax = max(dtScoreLU[(dtScoreLU[,CN] <= x),CN])
    return(dtScoreLU %>% select(Score) %>% 
    filter(dtScoreLU[,CN] == myMax))
    } else {
    myMin = min(dtScoreLU[as.vector(dtScoreLU[,CN] >= x),CN])
    return(dtScoreLU %>% select(Score) %>% 
    filter(dtScoreLU[,CN] == myMin))
    } 
}

1 Ответ

0 голосов
/ 28 августа 2018

Насколько я понимаю, это кажется хорошим кандидатом для использования функции data.table.

Итак, я хочу найти значение ScoreLU на основе таблицы df. Например, значение 1.3730682 в DSCRpd должно возвращать ScoreLU значение 60, потому что это больше, чем 1,35, но меньше, чем следующий значение 1,65.

library(data.table)
ScoreLU[, .(DSCRpd, Score)][df, ,on = 'DSCRpd', roll = TRUE]

       DSCRpd Score Leverage         TCB
 1: 1.3730682    60 2.010122 -1590099.11
 2: 1.0449597    20 2.680051   493370.85
 3: 1.0311141    20 4.790531    21594.63
 4: 1.3923007    60 3.279903  -499326.76
 5: 1.6443938    60 3.853003   988780.79
 6: 0.6265976    NA 1.814359  1003736.73
 7: 2.1025253    80 4.412528  1245305.83
 8: 1.2872873    50 2.074424  -688305.83
 9: 0.5088294    NA 2.504510  1406986.68
10: 1.7794307    70 3.724905  1132513.33

С другой стороны, для столбца «Кредитное плечо» он должен быть в порядке Desc т.е. первое значение 2,01 должно возвращать значение 60 в том виде, как оно есть меньше 2,5, но больше следующего значения 2,0.

ScoreLU[, .(Leverage, Score)][df, , on = 'Leverage', roll = TRUE]

    Leverage Score    DSCRpd         TCB
 1: 2.010122    60 1.3730682 -1590099.11
 2: 2.680051    50 1.0449597   493370.85
 3: 4.790531    10 1.0311141    21594.63
 4: 3.279903    40 1.3923007  -499326.76
 5: 3.853003    30 1.6443938   988780.79
 6: 1.814359    70 0.6265976  1003736.73
 7: 4.412528    20 2.1025253  1245305.83
 8: 2.074424    60 1.2872873  -688305.83
 9: 2.504510    50 0.5088294  1406986.68
10: 3.724905    30 1.7794307  1132513.33

Вы можете объединить их, если хотите:

ScoreLU[, .(Leverage, Score)][
  ScoreLU[, .(DSCRpd, Score)][
    df, ,on = 'DSCRpd', roll = TRUE
    ], , on = 'Leverage', roll = TRUE]

    Leverage Score    DSCRpd i.Score         TCB
 1: 2.010122    60 1.3730682      60 -1590099.11
 2: 2.680051    50 1.0449597      20   493370.85
 3: 4.790531    10 1.0311141      20    21594.63
 4: 3.279903    40 1.3923007      60  -499326.76
 5: 3.853003    30 1.6443938      60   988780.79
 6: 1.814359    70 0.6265976      NA  1003736.73
 7: 4.412528    20 2.1025253      80  1245305.83
 8: 2.074424    60 1.2872873      50  -688305.83
 9: 2.504510    50 0.5088294      NA  1406986.68
10: 3.724905    30 1.7794307      70  1132513.33

Для концов обеих переменных Score вы можете указать аргумент rollends при необходимости. Я бы прочитал ?data.table, если бы у вас было время. Это полезно для начала, так как синтаксис иногда может быть немного непрозрачным.

Я довольно новичок в data.table, так что любой, кто обладает большим опытом, может принять участие.

Данные

ScoreLU <- structure(list(Score = c(0L, 10L, 20L, 30L, 40L, 50L, 60L, 70L, 80L, 90L),
                          DSCRpd = c(0.65, 0.8, 0.95, 1.1, 1.2, 1.26, 1.35, 1.65, 2, 2.3),
                          Leverage = c(5, 4.5, 4, 3.5, 3, 2.5, 2, 1.5, 1, 0.5),
                          TCB = c(0L, 100000L, 250000L, 500000L, 850000L, 1250000L, 1700000L, 2300000L, 2900000L, 3600000L)),
                     .Names = c("Score", "DSCRpd", "Leverage", "TCB"), row.names = c(NA, -10L), class = c("data.table", "data.frame"))

df <- structure(list(DSCRpd = c(1.3730682, 1.0449597, 1.0311141, 1.3923007, 1.6443938, 0.6265976, 2.1025253, 1.2872873, 0.5088294, 1.7794307),
                     Leverage = c(2.010122, 2.680051, 4.790531, 3.279903, 3.853003, 1.814359, 4.412528, 2.074424, 2.50451, 3.724905),
                     TCB = c(-1590099.11, 493370.85, 21594.63, -499326.76, 988780.79, 1003736.73, 1245305.83, -688305.83, 1406986.68, 1132513.33)),
                .Names = c("DSCRpd", "Leverage", "TCB"),
                row.names = c(NA, -10L), class = c("data.table", "data.frame" ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...