# 이전글
# 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로 바꾸었다.
만약 KEGGREST에서 annotation이 잘 안 된다면 사용해 보시길 바랍니다. 첨부파일은 자유롭게 사용가능합니다.
감사합니다!