いろいろ倉庫

KNIME、EXCEL、R、Pythonなどの備忘録

【R】リストの使い方メモ

・お題:リストの使い方が分からないので、メモしておきたい。

 

・リストは、形式の異なるデータを詰め込めるデータ構造のこと。使うたびにググっていたので、少しまとめたい。

 

・とりあえずデータを作る。

> library(tidyverse) #Rを便利に使うパッケージ

> data <- list()

> data$ID <- c("A", "B", "C", "D", "E")
> data$Score <- c(1, 2, 3, 4, 5)
> data$Score2 <- c(1.1, 2.2, 3.3, 4.4, 5.5)
> data

 

・データを取り出してみる。

> data["ID"] #角ばった括弧で取り出せる。
$ID
[1] "A" "B" "C" "D" "E"

> data[c("ID", "Score") ] #ベクトルで指定しても取り出せる
$ID
[1] "A" "B" "C" "D" "E"

$Score
[1] 1 2 3 4 5

 

・こうして取り出すと、リスト形式になる。

> data["ID"] %>% is.list()
[1] TRUE

 

・ちなみに、パイプ演算子にも渡せるぽい。
> data %>% .["ID"]
$ID
[1] "A" "B" "C" "D" "E"

 

・角ばった括弧を二重にした演算子を使うと、ベクトルで取り出せる。

> data[ ["ID"] ] #二重角ばり括弧はブログの表示がおかしくなるので、スペースを入れてある。R上ではスペースを入れちゃダメ。
[1] "A" "B" "C" "D" "E"
> data[ ["ID"] ] %>% is.vector()
[1] TRUE
> data %>% .[ ["ID"] ]
[1] "A" "B" "C" "D" "E"

 

ドルマークでも取り出せる。ドルマークだと、$まで入力すると候補で出てくれるので便利。この場合もベクトルで取り出されるし、パイプ演算子で渡せる。

> data$ID
[1] "A" "B" "C" "D" "E"
> data$ID %>% is.vector()
[1] TRUE
> data %>% .$ID
[1] "A" "B" "C" "D" "E"

 

・角ばった括弧だと、BOOLのベクトルを渡しても取り出してくれる。除外するときに便利。

> data[c(TRUE, FALSE, TRUE) ]
$ID
[1] "A" "B" "C" "D" "E"

$Score2
[1] 1.1 2.2 3.3 4.4 5.5

 

> data[names(data) == "Score2"]
$Score2
[1] 1.1 2.2 3.3 4.4 5.5

 

> data[names(data) != "Score2"]
$ID
[1] "A" "B" "C" "D" "E"

$Score
[1] 1 2 3 4 5

 

・ちなみに、二重角ばり括弧にBOOL型を渡すと怒られる。

> data[ [names(data) == "Score2"] ]
Error in data[ [names(data) == "Score2"] ] : 
  attempt to select less than one element in integerOneIndex

 

・要素名ではなく、要素のインデックスを与えても取り出すことができる。これだと要素のインデックスにマイナスをつけるだけでその要素を除外できる。

> names(data)
[1] "ID"     "Score"  "Score2"

> data[1]
$ID
[1] "A" "B" "C" "D" "E"

> data[ [2] ]
[1] 1 2 3 4 5

> data[1:2]
$ID
[1] "A" "B" "C" "D" "E"

$Score
[1] 1 2 3 4 5

> data[-2]
$ID
[1] "A" "B" "C" "D" "E"

$Score2
[1] 1.1 2.2 3.3 4.4 5.5

 

・data.frameにするなら、as.data.frame関数を使う。

> df <- as.data.frame(data)
> df

 

・例えば、Scoreが2以上の行を抜き出す。

> df[df$Score > 2,]



おわり

【R】Heatmap.2のクラスタリング情報を扱ってみたい

・お題:遺伝子発現を比較する際に、ヒートマップというカラフルな図をheatmap.2を使って作ってみた。この図では階層型クラスタリングとセットで使われることが多い。図示するだけではなく、階層型クラスタリングの情報も扱ってみたい。

 

・正確には、クラスタリングしてから、クラスタリング情報をもとにheatmapを描いてもらう感じ。とりあえず、ライブラリを読み込んでデータセットを作る。

> library(tidyverse) #Rを便利に使うパッケージ
> library(gplots) #heatmap.2を含むパッケージ

> df <- data.frame(
+   sample1 = c(1, 2, 3, 4, 5),
+   sample2 = c(1.5, 2.5, 3.5, 4.5, 5.5),
+   sample3 = c(2, 3, 4, 5, 6),
+   sample4 = c(5, 4, 3, 2, 1),
+   sample5 = c(5.5, 4.5, 3.5, 2.5, 1.5),
+   sample6 = c(6, 5, 4, 3, 2),
+   row.names = c("geneA", "geneB", "geneC", "geneD", "geneE")
+   )

> df

 

・サンプル構成情報と処置条件情報もつけておく。

> samples <- names(df)
> groups <- 
+   c("DMSO","DMSO","DMSO","TEST","TEST","TEST") %>% 
+   as.factor(.)

 

・図示するだけなら、heatmap.2だけでできる。

> col <- colorpanel(1000,"blue","white","red") #色を指定しておく。

> col

以下略

> heatmap.2(x = as.matrix(df),
+           scale = "row",
+           labRow = row.names(df),
+           ColSideColors = c("green","orange")[groups],
+           labCol = samples, 
+           col = mycol,
+           trace = "none",
+           density.info = "none", 
+           margin = c(8,6),
+           dendrogram = "row")

クラスタリングの情報を使いたい場合、階層型クラスタリングを別にやる。

> hcl <- hclust(dist(df))

> plot(hcl) #図示してみる


・このクラスタリング情報を使ってヒートマップを描くには、Heatmap.2関数に引数Rowvにas.dendrogram(hcl)を与えれば良い。今回は行なのでRowvだけれど、列ならColvを与えてやれば良い。

> heatmap.2(x = as.matrix(df),
+           scale = "row",
+           labRow = row.names(df),
+           ColSideColors = c("green","orange")[groups],
+           labCol = samples, 
+           Rowv = as.dendrogram(hcl),
+           col = mycol,
+           trace = "none",
+           density.info = "none", 
+           margin = c(8,6),
+           dendrogram = "row")

 

・階層型クラスタリングなので、切るHeightによってできるクラスタの数が変わる。例えば、Heightを6や8にすれば、geneA, B / gene E, C, Dの2つのクラスタに分けられる。

> cutree(hcl, h=6)

・Heightを3や4に設定すれば、geneA, B / geneE / geneC,Dの3つのクラスタに分けられる。

> cutree(hcl, h=3)

 

クラスタ数を指定したいなら、引数kを与える。

> cutree(hcl, k=2)

 

・これはベクトルなので、適当に抜き出せる。

> cutree(hcl, h=3) %>% is.vector(.)
[1] TRUE

> row.names(df)[cutree(hcl, h=3) == 1]
[1] "geneA" "geneB"

 

・hclust関数の引数methodにいろいろ与えると、他のアルゴリズムでの階層型クラスタリングもできる。

 

 

おわり

 

【R】ドットプロットを作りたい

・お題:とあるデータをドットプロットで示したい。

 

・ライブラリを読み込む。

> library(tidyverse)
> library(kableExtra) #ぽりぽりできるグラフを作る

 

・データセットを作る。 
> df <- 
+   data.frame(
+     GeneID = c("geneA", "geneB", "geneC"),
+     test_rep1 = c(1, 2, 3),
+     test_rep2 = c(1.1, 2.1, 3.1),
+     test_rep3 = c(1.2, 2.2, 3.3),
+     ctrl_rep1 = c(10, 2, 0.3),
+     ctrl_rep2 = c(11, 1.5, 0.2),
+     ctrl_rep3 = c(12, 0.5, 0.25))

 

・ぽりぽりできる表で表示する
> df %>% 
+   kbl() %>%
+   kable_styling(fixed_thead = TRUE,
+                 html_font = "Times New Roman")

・ドットプロット用のデータを作成する。
> df_dotplot <-
+   df %>% 
+   tidyr::pivot_longer(.,
+                       cols = -GeneID,
+                       names_to = "sample")
> df_dotplot

 

・サンプル名を実験条件にしたいので、_で割る。

> df_dotplot <-
+   df_dotplot %>% 
+   tidyr::separate(.,
+                   col = sample,
+                   into = c("group", "SampleID"),
+                   sep = "_")
> df_dotplot

 

・ggplot2で図示する。

> g <- 
+   ggplot(data = df_dotplot,
+          mapping =  aes(x = group, y = value))
> g <-
+   g +
+   geom_jitter(height=0, width =0.1) +
+   stat_summary(fun.y = mean, geom="point", size =5, color = "red", shape=3)+

+   theme_bw()+
+   facet_wrap(~ GeneID, scales = "free_y")
> plot(g)

 

おわり