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]
comments powered by Disqus