Насколько я понимаю, это кажется хорошим кандидатом для использования функции 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" ))