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.