Hash table是程式語言中很重要的一種資料結構,可以方便我們用相對較省時和符合直覺的方式用來查找某些資料,在不同程式語言的實現方式都不太一樣,在R中我們其實有多種做法,都可以達到Hash table的效果,這邊舉一個例子,目的是為了設計用來對應基因變異與其變異的命名轉換,通常這些資料間的轉換出現的場景非常普遍,所以這謝的技術蠻實用的。
在R中可以分別使用vector, list和environment三種資料型態來達成這個目的。
# Study the R hash function # 測試用來查找的資料 test <- allele_to_rs_table$`Allele Name`[sample(198,size = 10)] # use Vector -------------------------------------------------------------- # _創建自己的hash table vector.hash <- allele_to_rs_table$`Rs#` names(vector.hash) <- allele_to_rs_table$`Allele Name` # _直接把test放進去vector.hash來完成 vector.hash[test] # use List ---------------------------------------------------------------- list.hash <- list() #_方法一建立list.hash lapply(allele_to_rs_table$`Allele Name`,function(x){list.hash[[x]] <- allele_to_rs_table$`Rs#`[ allele_to_rs_table$`Allele Name` == x ] }) #_方法二建立list.hash,使用傳統的方式 for (i in allele_to_rs_table$`Allele Name` ){ list.hash[[i]] <- allele_to_rs_table$`Rs#`[ allele_to_rs_table$`Allele Name` == i ] } #_直接查找 list.hash[["CYP2C9*13"]] lapply(test,function(x){list.hash[[x]]}) # use Environment --------------------------------------------------------- #_創建新子環境 e <- new.env() #_將環境中的object做處理 #_方法一 with(e, "CYP2C19*2" <- "rs4244285" ) #_方法二 assign("CYP2C19*2", "rs4244285", envir = e) #_查找 base::get("CYP2C19*2", envir=e, inherits = TRUE)
當然這些是直接使用base R的函數來實現,當要對應的key多的時候可以考慮進階使用如hash/digest這兩個package來幫助提高速度。
閱讀參考:
1.Hash Table Performance in R: Part I
2.Hash Table Performance in R: Part II
3.Hash Table Performance in R: Part III
很不錯喔!再努力!
讚讚