Bioinformatics/기타

[KEGG] KO, EC번호를 kegg pathway와 매치시키는 법 KEGG annotation database

김해김씨99대손 2024. 8. 12. 12:20

 

 

 

# 이전글

 

[ggpicrust2] picrust2 결과물을 시각화 하는 ggpicrust2 튜토리얼

작성 : 2023.04.13~2023-04-17수정: 2024-02-05picrust2 visualization 들어가기에 앞서오늘은 올해 따끈따끈하게 출시된(무려 2023년 4월 8일) ggpicrust2 패키지를 소개합니다. ggpicrust2는 마이크바이옴의 기능 예측

bio-kcs.tistory.com

 

[web crawling] KEGG PATHWAY level에 따른 표를 가져와보자 Structured Tables from KEGG Pathway Data

🟦 목적 ggpicrust2 도구 사용 시, Kegg number에 따라 annotation 할 때, kegg 서버에 문제가 생기는 일이 매우 잦았다. 이를 해결하고자, web을 기준으로 다운받아서 table형태로 저장하고자 한다.  하지만

bio-kcs.tistory.com

 

 

 

 

# KO와 KEGG

- KEGG는 Kyoto Encyclopedia of Genes and Genomes의 약자로 일본에서 생산된  생화학 pathway 관련 데이터베이스이다.

- KEGG Pathway는 생화학적 경로를 각 기능별로 정의한 것이다. 

   e.g. Glycolysis / Gluconeogenesis경로: 포도당 대사와 관련된 여러 효소와 대사 물질의 상호작용

- KO (KEGG Orthology)는 세부적인  유전자 기능을 분류하는 시스템을 말한다. 

   e.g. K01810 KO ID는 "glucose-6-phosphate isomerase"라는 효소의 기능적 역할을 정의

 

 

# 코드 

1. 홈페이지에서 KO의 계층적인 구조를 담고 있는. htext형식 파일 다운로드

1)  홈페이지 접속: https://www.genome.jp/kegg-bin/get_htext?htext=KO&query=hydroxyphenylacetate

2) "Download htext"

- json형식도 지원한다. 

- 나는 처리가 쉬운 htext형식을 선택하여 처리하였다. 

 

파일의 구조는 아래와 같다. 

행의 첫 번째 글자가 계층 단계를 나타내며, A~D까지 존재한다.

 

 

2. 파일을 R에서 각 줄별로 읽어온다. 

library(readr)
library(stringr)
liness <- read.delim2("./KO")
lines <- liness$X.D

 

 

3. 전처리 

- A는 pathway level1, B는  pathway level2, C는 pathway level3, D는 KO를 나타낸다. 

- 각 level에 따라서 다른 열에 할당하고 마지막에 list형식을 합쳐주자.

# Initialize variables to hold the current levels
level_A <- level_B <- level_C <- NA
data <- list()

# Loop through each line to process the hierarchy
for (line in lines) {
  # Remove leading and trailing whitespaces
  line <- trimws(line)
  
  if (startsWith(line, "A")) {
    content <- trimws(substr(line, 2, nchar(line))) 
    level_A <- substring(content, 2)
    
  } else if (startsWith(line, "B")) {
    content <- trimws(substr(line, 2, nchar(line))) 
    level_B <- substring(content, 2)
  } else if (startsWith(line, "C")) {
     content <- trimws(substr(line, 2, nchar(line))) 
    level_C <- substring(content, 2)
  } else if (startsWith(line, "D")) {
    content <- trimws(substr(line, 2, nchar(line))) 
    level_D <- substring(content, 2)
    data <- append(data, list(c(level_A, level_B, level_C, level_D)))
  }
}

# Convert the list to a data frame
data <- do.call(rbind, data)
colnames(data) <- c("Level1", "Level2", "Level3", "KO")

# Convert to data frame
data2 <- as.data.frame(data, stringsAsFactors = FALSE)

# View the flattened data frame
print(data2)
dim(data2) #  61655     4

 

 

4. ko, kegg, ec번호 추출 

- 데이터내에서 ko와 ec, kegg번호를 새로운 열로 추가해 보자.

data3 <- data2
data3$KEGG <- paste0("ko", sub(".*(\\d{5})\\]$", "\\1", data3$Level3)) # 뒷 부분에서 한 글자 제외하고 5자 긁어오기
data3$EC<-  paste0("EC:",str_extract(data3$KO, "(?<=EC:)[^]]+")) # EC다음 부분 긁어오기 
data3$KO_num<-  paste0("K", substr(x = data3$KO , start = 1, stop = 6)) # 앞부분의 1부터 6까지 자리 긁어오기 
data3[is.na(data3)] <- ""  

library(data.table)
fwrite(data3, "./KO_20240812_ff.csv")

저장 시 Rbase의 write.table을 사용하여 txt파일을 생성했더니, 일부 오류가 존재했다. 

csv저장 시 오류는 일어나지 않았다. 

 

 

 

# 결과물 

짜잔!

이로써 약 6만 개에 달하는 ko데이터를 모두 정리하였다. 

저장된 csv파일에서 또한 EC번호가 존재하는 것은 EC열을 NA로 바꾸었다.

 

 

 

KO_20240812_ff.csv
11.03MB

 

만약 KEGGREST에서 annotation이 잘 안 된다면 사용해 보시길 바랍니다. 첨부파일은 자유롭게 사용가능합니다. 

감사합니다!

 

 

반응형