Ini ialah cara untuk recode atau compute data menggunakan pakej data.table
.
Recode
Mendukarkan nilai dikolom tanpa membuat kolom baru boleh dilakukan seperti begini. Contoh dataset yang digunakan untuk proses ini ialah DT.
library(data.table)
DT <- data.table(a=rep(0:1, 5), b=letters[1:10])
> DT
a b
1: 0 a
2: 1 b
3: 0 c
4: 1 d
5: 0 e
6: 1 f
7: 0 g
8: 1 h
9: 0 i
10: 1 j
Bagaimana untuk menukarkan kod di kolom a dari [0,1] ke [3,4]?
Cara dengan menggunakan pakej data.table
ialah seperti begini:
DT[.(a = 0:1, to = 3:4), on = "a", a := i.to]
Kolom a ditukarkan ke kod [3,4]. Pemakaian a := i.to
untuk memastikan kolom a digantikan dengan nilai yang baru tanpa membuat kolom baru yang mengandungi nilai tersebut.
> DT
a b
1: 3 a
2: 4 b
3: 3 c
4: 4 d
5: 3 e
6: 4 f
7: 3 g
8: 4 h
9: 3 i
10: 4 j
Compute
Membuat kolom baru berasaskan kondisi dikolom yang sedia ada. Contoh praktikal yang saya gunakan untuk memberikan nama-nama rumah sakit kolom baru iaitu hosKort
.
hosNavnKort <- c("Akershus", "Forde", "Haugesund", "Haukeland", "Sandessjoen", "Finnmark",
"Kristiansund", "Molde", "Namsos", "Bodo", "Trondheim",
"Stavanger", "Vestfold", "Gjovik", "Lillehammer", "Elverum", "Levanger",
"Telemark", "Ostfold", "Arendal", "Kristiansand", "Ulleval",
"Nord_norge", "Harstad", "Drammen", "Alesund")
# hosDT[, kortID := hospID]
# hosDT[.(kortID = 1:26, to = hosNavnKort), on = "kortID", hosKort := i.to]
hosDT[.(hospID = 1:26, to = hosNavnKort), on = "hospID", hosKort := i.to]
Cara ini sama seperti melarikan cara begini:
hosDT[hospID == 1, hosKort := "Akershus"][
hospID == 2, hosKort := "Forde"][
hospID == 3, hosKort := "Haugesund"][ dan seterusnya... ]
Sekiranya asas untuk menghasilkan kolom baru bergantung kepada lebih dari satu kolom boleh dibuat seperti begini.
dd1 <- data.table(a=rep(c("Ja", "Nei"), 5), b = rep(letters[1:3],2))
Buat kolom c dan nilai 1 sekiranya kolom a ialah Nei.
dd1[list(a = "Nei", to = 1), on = "a", c := i.to]
Buat kolom d dengan nilai 2 sekiranya kolom a ialah Ja dan kolom b ialah a
dd1[list(a="Ja", b="a", to = 2), on = c("a", "b"), d := i.to]
Buat kolom f dengan nilai 5 sekiranya kolom a ialah Ja dan kolom b bernilai b. Sekiranya kolom a bernilai Ja dan kolom b bernilai c maka kolom f diberikan nilai 8.
a1 <- c("b", "c")
dd1[.(a="Ja", b = a1, to = c(5,8)), on = c("a", "b"), f := i.to]