Lookup table dipakai untuk mempercepatkan proses dan mengelakkan pemakaian ifelse. Untuk mempercepatkan proses, ordered index untuk data.table harus dipakai.

Cara 1

Cara ini ialah untuk mendapakan nilai ScoreLU yang terdapat di dataset dt2 melalui kolom kekunci DSCRpd dikedua-dua data.table. Sekiranya nilai di DSCRpd di dt1 tidak sama dengan dt2, nilai yang berhampiran di DSCRpd dirujuk untuk mendapatkan nilai ScoreLU.

dt1
   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

dt2
   ScoreLU 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

Kode ini dipakai sekiranya ingin mendapakan nilai di lookup tabel yang berhampiran roll = "nearest".

setDT(df1)[, ScoreLU  := setDT(df2)[df1, ScoreLU , on = "DSCRpd", roll = "nearest"]]

Nilai ScoreLU bagi kekunci DSCRpd 1.3730682 dan 1.3923007 di dt1 ialah 60 kerana nilai DSCRpd yang berhampiran di data dt2 ialah 1.35. Hasil yang sama dilihat untuk dt1$DSCRpd %in% c(1.0449597 , 1.0311141) yang hampir dengan dt2$DSCRpd == 1.10 yang memberikan nilai ScoreLU == 30. Hasilnay seperti begini:

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

Cara 2

Cara ini sama seperti di atas cuma diterangkan secara mudah. Untuk menunjukkan cara ini kita buatkan data sebagai contoh:

DT <- data.table(V1=0:2,
                 V2=LETTERS[1:3],
                 V4=1:12)
                 
    V1 V2 V4
 1:  0  A  1
 2:  1  B  2
 3:  2  C  3
 4:  0  A  4
 5:  1  B  5
 6:  2  C  6
 ...truncated

Untuk tukarkan V1 dari nilai c(1,2) ke nilai c(0,1) atau tukar huruf, caranya:

DT[.(V1 = 1:2, to = 0:1), on = "V1", V1 := i.to]

    V1 V2 V4
 1:  0  A  1
 2:  0  B  2
 3:  1  C  3
 4:  0  A  4
 5:  0  B  5
 6:  1  C  6
 ...truncated

DT[.(V2 = LETTERS[1:3], to = c("T", "K", "D")), on = "V2", V2 := i.to]

    V1 V2 V4
 1:  0  T  1
 2:  0  K  2
 3:  1  D  3
 4:  0  T  4
 5:  0  K  5
 6:  1  D  6
 ...truncated

Di sini .(V1 = 1:2, to = 0:1) ialah sebagai table rujukan. Sekiranya rujukkan (lookup table) tidak tersedia, boleh di buat berasingan:

lut1 <- data.table(V2 = LETTERS[1:3], to = c("T", "K", "D"))

   V2 to
1:  A  T
2:  B  K
3:  C  D

## Pakai 2 kekunci
lut2 <- data.table(V1 = 1:2, V4 = 2:3, to = 11:12)

   V1 V4 to
1:  1  2 11
2:  2  3 12

Kemudian bolehlah di update joins data:

DT[lut1, on = "V2", V2 := i.to]
DT[lut2, on = c("V1", "V4"), V1 := i.to]

    V1 V2 V4
 1:  0  A  1
 2: 11  B  2
 3: 12  C  3
 4:  0  A  4
 5:  1  B  5
 6:  2  C  6
 .. truncated

Cara ini diambil dari stackoverflow.

comments powered by Disqus