用R做hash table來對照rsid和allele names

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

對「用R做hash table來對照rsid和allele names」的一則回應

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s