ハッシュテーブル

Perl や Python などのプログラミング言語に見られるハッシュやディクショナリーにあたるものは R にはない。しかし、R のベクトルあるいはリストオブジェクトは名前をつけることが可能であり、これを利用することで「ハッシュのようなもの」を作成できる。

ベクトルでハッシュテーブルを作成

最も簡単な例としては、R のベクトルに名前をつけるだけで「ハッシュのようなもの」を作成できる。R のベクトルを利用するので、1 つのキーに対して一つの値しか保存できない。また、すべての値の型が同じである必要ある。

aaa2a <- c("A", "C", "D", "E", "F", "G", "H")
names(aaa2a) <- c("ALA", "CYS", "ASP", "GLU", "PHE", "GLY", "HIS")

aaa2a["ALA"]
## ALA
## "A"

aaa2a[c("PHE", "GLY", "CYS")]
## PHE GLY CYS
## "F" "G" "C"

as.character(aaa2a[c("PHE", "GLY", "PHE", "ALA")])
## [1] "F" "G" "F" "A"

リストでハッシュテーブルを作成

R のリストは様々な型のオブジェクトを保存することができる。また、リストの中にリストを保存することもできる。そのため R のリストを利用して「ハッシュのようなもの」を作成した場合、他のプログラミングでいうハッシュのハッシュや二次元ディクショナリーなどを実現することができる。

遺伝子 ID を与えて、それに関連付けられている GO ID を取得できるようなハッシュテーブルをリストで作成する。値を取得する際に、unlistas.character などの関数を合わせて利用するとよい。

GENE2GO <- vector("list", length = 5)
names(GENE2GO) <- c("AT3G04930", "AT1G80200", "AT5G19172", "AT3G04480", "AT3G05130")
GENE2GO[["AT3G04930"]] <- c("GO:0003677", "GO:0005634", "GO:0006355")
GENE2GO[["AT1G80200"]] <- c("GO:0003674", "GO:0008150")
GENE2GO[["AT5G19172"]] <- c("GO:0005576", "GO:0031640", "GO:0050832")
GENE2GO[["AT3G04480"]] <- c("GO:0004521", "GO:0090502")
GENE2GO[["AT3G05130"]] <- c("GO:0003674")

unlist(GENE2GO[c("AT3G04930", "AT3G04480")])
##   AT3G049301   AT3G049302   AT3G049303   AT3G044801   AT3G044802
## "GO:0003677" "GO:0005634" "GO:0006355" "GO:0004521" "GO:0090502"

as.character(unlist(GENE2GO[c("AT3G04930", "AT3G04480")]))
## [1] "GO:0003677" "GO:0005634" "GO:0006355" "GO:0004521" "GO:0090502"

ハッシュのハッシュ

リストの中にリストを保存することで、「ハッシュのハッシュのようなもの」を R で実現できる。値を取り出すとき、["key"] を使うべきか [["key"]] を使うべきかは迷いどころ。

GENE2GO <- vector("list", 2)
names(GENE2GO) <- c("AT3G04930", "AT2G17260") 
GENE2GO[["AT3G04930"]] <- list(
                MF = c("GO:0003677"),
                CC = c("GO:0005634"),
                BP = c("GO:0006355")
              )
GENE2GO[["AT2G17260"]] <- list(
                MF = c("GO:0005217"),
                CC = c("GO:0005576", "GO:0005886"),
                BP = c("GO:0006874", "GO:0010118", "GO:0030003", "GO:0009416")
              )

GENE2GO[["AT2G17260"]][["CC"]]
## [1] "GO:0005576" "GO:0005886"