User Tools

Site Tools


manipulation_of_ani_matrix_data_file_using_r

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
manipulation_of_ani_matrix_data_file_using_r [2023/02/15 11:42] – [Label을 자유롭게 편집하기] hyjeongmanipulation_of_ani_matrix_data_file_using_r [2023/02/15 17:04] (current) – [Label을 자유롭게 표시하기] hyjeong
Line 1: Line 1:
-====== R을 이용하여 ANI matrix 자료 다루기(작성 중) ====== +====== R을 이용하여 ANI matrix 자료 다루기 ====== 
-제목은 ANI matrix(행렬)라고 하였으나 실제로는 dataframe 형태의 자료를 다루는 기술에 관하여 작성한 글이다. 실습용 파일 {{ :ani_r_exercise.zip}}을 다운로드하여 압축을 해제한다. RefSeq genome 51개를 [[https://github.com/widdowquinn/pyani|pyani]](blast)로 처리하여 얻은 결과 중 일부 파일과 newick tree 및 accession 관련 파일이 포함되어 있다.+제목은 ANI matrix(행렬)라고 하였으나 실제로는 **dataframe 자료**를 다루는 기술에 관하여 작성한 글이다. 실습용 파일 {{ :ani_r_exercise.zip}}을 다운로드하여 압축을 해제한다. RefSeq genome 51개를 [[https://github.com/widdowquinn/pyani|pyani]](blast)로 처리하여 얻은 결과 중 일부 파일과 newick tree 및 accession 관련 파일이 포함되어 있다.
  
   $ unzip ANI_R_exercise.zip   $ unzip ANI_R_exercise.zip
Line 10: Line 10:
       inflating: accessions.txt       inflating: accessions.txt
  
-[[http://stat405.had.co.nz/r-style.html|해들리 위캠이 권하는 R 스타일 가이드]]에 의하면 할당문에는 = 말고 <-를 쓰라고 권장하는데 이는 나의 습과는 배치된다. 취향의 문제니까 별로 중요하지는 않다.+[[http://stat405.had.co.nz/r-style.html|해들리 위캠이 권하는 R 스타일 가이드]]에 의하면 할당문에는 '=말고 '<-'를 쓰라고 권장하는데 이는 나의 습과는 배치된다. 취향의 문제니까 별로 중요하지는 않다. 대부분의 프로그래밍 언어에서 '='를 쓴다는 현실을 잊지 말도록 하자.
   Use <-, not =, for assignment.   Use <-, not =, for assignment.
 ===== 데이터 파일을 읽어들이고 기본 점검하기 ===== ===== 데이터 파일을 읽어들이고 기본 점검하기 =====
Line 17: Line 17:
 매트릭스가 아니라 dRep의 Ndb.csv 파일과 같이 <id1>,<id2>,<value> 형태의 파일이라면 임포트한 뒤 reshape 라이브러리를 사용하여 매트릭스로 전환하도록 한다([[https://blog.genoglobe.com/2018/04/r-reshape-pairwise.html|참조글]]). 매트릭스가 아니라 dRep의 Ndb.csv 파일과 같이 <id1>,<id2>,<value> 형태의 파일이라면 임포트한 뒤 reshape 라이브러리를 사용하여 매트릭스로 전환하도록 한다([[https://blog.genoglobe.com/2018/04/r-reshape-pairwise.html|참조글]]).
  
-pyani 결과물에서는 행과 열의 이름의 이미 같은 순서대로 존재한다. 굳이 확인하고 싶다면 다음과 같이 한다.+pyani 결과물에서 행과 열의 이름은 이미 같은 순서다. 굳이 확인하고 싶다면 다음과 같이 한다.
   > x = colnames(ani)   > x = colnames(ani)
   > y = rownames(ani)   > y = rownames(ani)
Line 99: Line 99:
   ...   ...
      
-이미 대칭 상태가 되도록 처리를 마친 ani 데이터프레임의 row 라벨을 균주명으로 치환한 ani_s를 생성한 뒤 클러스터링을 해 보자. 아래에 보인 코드의 for{} 블록 내부에 있는 row.names() 함수를 names()로 바꾸면 컬럼 라벨을 바꾸는 효과가 있다.+이미 대칭 상태가 되도록 처리를 마친 ani 데이터프레임의 row 라벨을 균주명으로 치환한 ani_s를 생성한 뒤 클러스터링을 해 보자. 아래에 보인 코드의 for{} 블록 내부에 있는 row.names() 함수를 names()로 바꾸면 컬럼 라벨을 바꾸는 효과가 있다. Named vector를 이용하는 매우 유용한 예제이므로 잘 익혀두기 바란다. 바꾸기 전의 라벨이 key 벡터에 들어있고, 바꾸고 나서의 라벨은 names(key)로 지정함을 잊지 말자.
  
   > data = read.table("accession-strain.csv",sep=",",stringsAsFactors=F)   > data = read.table("accession-strain.csv",sep=",",stringsAsFactors=F)
-  > key = data[,1] +  > key = data[,1]         # GCF_000463565.1 
-  > names(key) = data[,2]+  > names(key) = data[,2]  # Paenibacillus polymyxa WLY78 
 +  > key 
 +         Paenibacillus polymyxa WLY78      Paenibacillus polymyxa DSM 365  
 +                    "GCF_000463565.1"                   "GCF_000714835.1"  
 +  ...
   > ani_s = ani   > ani_s = ani
   > for (i in row.names(ani_s)) {   > for (i in row.names(ani_s)) {
Line 165: Line 169:
  
 ==== Heatmap 그리기 ==== ==== Heatmap 그리기 ====
-우선 ani 데이터프레임을 자체적으로 클러스터링하여 heatmap을 만들어 보자. gplots heatmap.2()는 레이아웃을 수정하지 않으면 보기에 좀 불편할 것이다. 자세한 사항은 이전에 쓴 글 [[data_visualization|Data visualization]]을 참고하라.+우선 ani 데이터프레임을 자체적으로 클러스터링하여 heatmap을 만들어 보자. gplots heatmap.2()는 레이아웃을 수정하지 않으면 보기에 좀 불편할 것이다. 자세한 사항은 이전에 쓴 글 [[data_visualization|Data visualization]]을 참고하라. 반면 ComplexHeatmap Heatmap()은 특별히 레이아웃을 건드리지 않아도 라벨이 길다고 하여 경계 바깥으로 잘리거나 하지 않아서 매우 좋다.
   > library(gplots)   > library(gplots)
   > heatmap.2(as.matrix(ani),col=greenred(10),trace="none",scale="none",dendrogram=c("row"))   > heatmap.2(as.matrix(ani),col=greenred(10),trace="none",scale="none",dendrogram=c("row"))
   > library(ComplexHeatmap)   > library(ComplexHeatmap)
-  > Heatmap(as.matrix(ani), name="test", row_names_gp = gpar(fontsize = 5), column_names_gp = gpar(fontsize = 5)) +  > Heatmap(as.matrix(ani), name="ANI", row_names_gp = gpar(fontsize = 5), column_names_gp = gpar(fontsize = 5)) 
 +{{ :heatmap_20230215.png?400 |Heatmap()으로 그렸음.}}
 이번에는 row와 column을 서로 다른 방식으로 클러스터링해 보자. row는 임포트한 트리(ezTree_51_pfam_rooted.nwk, dendrogram 객체여야 함)를 기준으로 정렬하되 column은 ani 데이터프레임의 값으로 자체적인 클러스터링을 적용한다. 실제로 그려보니 별로 예쁘질 않다. 이번에는 row와 column을 서로 다른 방식으로 클러스터링해 보자. row는 임포트한 트리(ezTree_51_pfam_rooted.nwk, dendrogram 객체여야 함)를 기준으로 정렬하되 column은 ani 데이터프레임의 값으로 자체적인 클러스터링을 적용한다. 실제로 그려보니 별로 예쁘질 않다.
-  > Heatmap(as.matrix(ani), name="test", cluster_rows = tree.2, row_names_gp = gpar(fontsize = 5), column_names_gp = gpar(fontsize = 5))+  > Heatmap(as.matrix(ani), name="ANI", cluster_rows = tree.2, row_names_gp = gpar(fontsize = 5), column_names_gp = gpar(fontsize = 5))
 row와 column 전부 tree.2를 기준으로 정렬해 보자. row와 column 전부 tree.2를 기준으로 정렬해 보자.
-  > Heatmap(as.matrix(ani), name="test", cluster_rows = tree.2, cluster_columns = tree.2, row_names_gp = gpar(fontsize = 5), column_names_gp = gpar(fontsize = 5)) +  > Heatmap(as.matrix(ani), name="ANI", cluster_rows = tree.2, cluster_columns = tree.2, row_names_gp = gpar(fontsize = 5), column_names_gp = gpar(fontsize = 5)) 
-==== Label을 자유롭게 편집하기 ==== +==== Label을 자유롭게 표시하기 ==== 
-앞서서 accession-strain.csv 파일로부터 얻은 data 데이터프레임이 필요하다. 위에서 보인 ani 데이터프레임의 라벨 치환 사례에서는 data 데이터프레임에서 key라는 named vector를 생성하여 사용했었다. 이번에는 동일한 data 데이터프레임을 사용하지만 key와는 반대 구조를 갖는 named vector를 만들어야 한다. 편의상 row label만 실제 균주의 full name으로 바꾸어서 heatmap을 그려 보자. +위에서 보인 ani 데이터프레임의 라벨 치환 사례에서는 accession-strain.csv 파일로부터 data 데이터프레임을 만들고, 이로부터 key라는 named vector를 생성하여 사용했었다. 그러나 Heatmap() 함수는 각 축의 고유한 라벨은 그대로 두되 그림으로 나타낼 라벨만 원하는 형태로 바꿀 수 있다. 단, data 데이터프레임으로부터 아까의 것과는 반대 구조를 갖는 named vector(key.2)를 만들어야 한다. 편의상 row label만 실제 균주의 full name으로 바꾸어서 heatmap을 그려 보자. 
-  > key.2 = data[,1+  > key.2 = data[,2       # Paenibacillus polymyxa WLY78 
-  > names(key.2) = data[,2+  > names(key.2) = data[,1# GCF_000463565.1 
-  > Heatmap(ani, name = "test", row_labels = key.2[rownames(ani)], row_names_gp = gpar(fontsize = 5), column_names_gp = gpar(fontsize = 5)) +  > key.2 
- +                        GCF_000463565.1                       GCF_000714835.1  
 +         "Paenibacillus polymyxa WLY78"      "Paenibacillus polymyxa DSM 365"  
 +  ... 
 +  > Heatmap(as.matrix(ani), name = "ANI", row_labels = key.2[rownames(ani)], row_names_gp = gpar(fontsize = 5), column_names_gp = gpar(fontsize = 5)) 
 +{{ :heatmap_20230215b.png?400 |Row label을 치환하여 그린 heatmap. 데이터프레임 자체의 row label은 바뀌지 않았다.}} 
 +ComplexHeatmap의 활용법을 자세히 알아보려면 [[https://jokergoo.github.io/ComplexHeatmap-reference/book/index.html|Complete Reference]]를 참고하기 바란다.
manipulation_of_ani_matrix_data_file_using_r.1676428979.txt.gz · Last modified: by hyjeong