Terbaru [08.10.2020]

Untuk menukarkan kode penggunaan ifelse adalah cara yang senang dipakai. Akan tetapi penggunaannya di base R memakai masa yang panjang terutama sekirannya melarikan di data yang besar. Ini kerana penggunaan ifelse di base terlebih dahulu menyusun data sebelum membuat pilihan.

Cara yang diterangkan disini ialah untuk pemakaian ifelse di data.table dan cara-cara lain yang diperkenalkan di pakej dplyr atau pakej yang lainnya.

Cara data.table

Cara yang biasa di data.table ialah menggunakan teknik DT[i,j,by]. Contoh lain bila ingin menukarkan var2 kepada angka 2 sekiranya var1 ialah ja.

DT[var1 == "ja", var2 := 2]

Contoh di bawah menggunakan cara piping dengan magrittr.

ispDT[, ispad2 := 0] %>%
  .[alder >= 10 & diagVar >= 2, ispad2  := 1] %>%
  .[alder < 10 & diagVar >= 5, ispad2 := 1]

Sekiranya ingin menukarkan pelbagai nilai di var1 contohnya ja = 1 dan nei = 2 di var2 boleh juga dibuat seperti cara begini menggunakan prinsip di SQL:

DT[.(var1 = c("ja", "nei"), to = 1:2), on = "var1", var2 := i.to]

Pengunaan set juga disarankan untuk mempercepatkan proses di data.table sekiranya ingin memakai loop. Contoh bila ingin menukarkan semua kolom yang menggandungi angka 3 atau 5 kepada nilai NA boleh dibuat seperti begini:

for(j in seq_along(DT)) {
      set(DT, i=which(DT[[j]] %in% c(3,5)), j=j, value=NA)
  }

Cara yang lebih advance boleh dibaca di Stack Overflow. Ringkasan penerangan cara ini:

We specify the ‘selectedcols’ in .SDcols, grouped by sequence of rows, we unlist the Subset of Data.table (unlist(.SD)), get the index of the first non-NA value (‘j1’), use that to get the ‘v1’ corresponding to the index and the column names, assign (:=) to create two new columns.

Aim is to get the best value for each row which is the value of the first non-NA column in the given order of selected columns.

library(data.table)
library(magrittr)
n <- 7
set.seed(1234)
dt <- sample.int(100, n*5, replace = TRUE) %>%
  ifelse(. < 35, NA, .) %>%
  matrix(, nrow = n) %>%
  as.data.table()

selected_cols <- c("V3", "V4", "V1")

dt[, c("best_val", "best_col") := {v1 <- unlist(.SD)
     j1 <- which(!is.na(v1))[1]
     list(v1[j1], names(.SD)[j1]) },
        .SDcols = selected_cols, by = 1:nrow(dt)]
dt
#   V1 V2 V3 V4 V5 best_val best_col
#1: NA NA NA NA 84       NA       NA
#2: 63 67 84 NA NA       84       V3
#3: 61 52 NA NA 46       61       V1
#4: 63 70 NA NA NA       63       V1
#5: 87 55 NA 82 NA       82       V4
#6: 65 NA NA 53 51       53       V4
#7: NA 93 NA 92 NA       92       V4

Cara dplyr

Menggunakan fungsi ifelse dimana ianya lebih cepat dari base R ifelse. Penerangan lanjut boleh dibaca di blog Holly Emblem.

ispDT[, ispad1 := 0]
ispDT[, ispad1 := dplyr::if_else(alder >=10 & diagVar >=2, 1, 0)]
ispDT[, ispad1 := dplyr::if_else(alder < 10 & diagVar >=5, 1, ispad1)]
ifelse  loop 
comments powered by Disqus