1 GEO菜單初覽
1.1 GDS目錄
1.2 GPL目錄
1.3 GSE目錄
1.4 GSM目錄
2 使用R包rvest下載GEO菜單
2.1 以GPL數(shù)據(jù)的一個(gè)頁面為例
2.2 批量下載GPL數(shù)據(jù)目錄
2.3 批量下載GSE數(shù)據(jù)目錄
2.4 批量下載GSM數(shù)據(jù)目錄
2.5 保存及更新下載的數(shù)據(jù)
3 使用R包tidyverse整理GEO菜單
3.1 整理GPL數(shù)據(jù)目錄
3.2 整理GSE數(shù)據(jù)目錄
3.3 整理GSM數(shù)據(jù)目錄
3.4 保存清潔的GEO數(shù)據(jù)目錄
3.5 提取感興趣的某個(gè)GSE的相關(guān)數(shù)據(jù)條目
4 有了GEO菜單數(shù)據(jù)陵究,能做些什么?
5 sessionInfo
- GEO菜單初覽
GEO數(shù)據(jù)庫存儲(chǔ)了海量的功能基因組學(xué)數(shù)據(jù)元潘,來源于全球的研究者們利用各種芯片和測(cè)序技術(shù)產(chǎn)生的數(shù)據(jù)畔乙。無論是做腫瘤還是非腫瘤的小伙伴,都會(huì)覺得這個(gè)數(shù)據(jù)庫很香翩概,不是嗎牲距。“用別人的數(shù)據(jù)钥庇,發(fā)自己的文章”牍鞠,再或者“用別人的數(shù)據(jù),篩自己感興趣的疾病分子”评姨,會(huì)不會(huì)做夢(mèng)都笑出了聲难述。
GEO中有哪些具體的數(shù)據(jù)深碱,有沒有一個(gè)菜單侵状?肯定是有的,而且菜單相當(dāng)厚琼娘,給點(diǎn)菜帶來了諸多不便嗦枢。
從GEO網(wǎng)站主頁攀芯,我們可以看到,GEO數(shù)據(jù)分為了4個(gè)大類文虏,也就是GDS侣诺、GSE殖演、GPL、GSM年鸳。其中GSM的數(shù)據(jù)條目最多趴久,超過了350萬個(gè)。在開始創(chuàng)建我們的菜單前搔确,我們先分別來看看數(shù)據(jù)條目:
1.1 GDS目錄
GDS的數(shù)據(jù)量最少彼棍,且2016/2/1后就沒再更新。GDS目錄下包含了GDS編號(hào)妥箕、GDS名稱滥酥、物種、GDS對(duì)應(yīng)的GPL平臺(tái)畦幢、GDS來源的GSE數(shù)據(jù)和該GDS數(shù)據(jù)的樣本數(shù)量等信息坎吻。
1.2 GPL目錄
GPL目錄頁面,分頁列出了所有GPL的簡(jiǎn)要信息宇葱,包括GPL編號(hào)瘦真、GPL名稱、GPL使用的技術(shù)類別黍瞧、物種诸尽、該GPL的注釋信息行數(shù)、應(yīng)用該GPL平臺(tái)的GSM數(shù)量印颤、應(yīng)用該GPL平臺(tái)的GSE數(shù)量您机、聯(lián)系方式、發(fā)布日期等信息年局。
注意此處的Page size:20际看,最大可以設(shè)置為500/頁;總頁數(shù):1043矢否,還有Release date仲闽,可以按照日期升序或者降序排列。后續(xù)我們使用R爬取數(shù)據(jù)時(shí)可以更改這些設(shè)置僵朗。
1.3 GSE目錄
GSE目錄同上赖欣,包含了GSE編號(hào)、GSE標(biāo)題验庙、GSE數(shù)據(jù)的類型顶吮、該GSE的樣本數(shù)量、以及對(duì)應(yīng)的GDS鏈接粪薛、補(bǔ)充文件的格式云矫、聯(lián)系方式以及該GSE的發(fā)布日期。
1.4 GSM目錄
GSM目錄包含了所有GSM數(shù)據(jù)編號(hào)汗菜、GSM標(biāo)題让禀、GSM數(shù)據(jù)類型、物種陨界、發(fā)布日期等信息巡揍。
2. 使用R包rvest下載GEO菜單
因?yàn)镚DS數(shù)據(jù)不太常用,而且其在GEO中存儲(chǔ)的頁面沒有固定的鏈接格式菌瘪。我們此次下載其他三類數(shù)據(jù)腮敌,即GPL、GSE俏扩、GSM數(shù)據(jù)目錄糜工。
2.1 以GPL數(shù)據(jù)的一個(gè)頁面為例
2.1.1 加載R包
library(rvest)
library(tidyverse)
library(magrittr)
library(lubridate)
library(R.utils)
2.1.2 獲取GPL數(shù)據(jù)目錄url鏈接
將頁面設(shè)置為每頁顯示最大數(shù)量條目,500/頁录淡;將數(shù)據(jù)按照時(shí)間升序排列捌木,方便后續(xù)更新數(shù)據(jù)時(shí)無縫銜接;發(fā)現(xiàn)目前共有42頁嫉戚,選擇第2頁刨裆。地址欄鏈接為:https://www.ncbi.nlm.nih.gov/geo/browse/?view=platforms&sort=date&display=500&page=2
首先下載該頁面的數(shù)據(jù)條目表格,代碼如下:
url_test <- "https://www.ncbi.nlm.nih.gov/geo/browse/?view=platforms&sort=date&display=500&page=2"
url_test <- "https://www.ncbi.nlm.nih.gov/geo/browse/?view=platforms&sort=date&display=500&page=2"
test_table <- read_html(url_test) %>%
# 讀取網(wǎng)頁鏈接
html_table() %>%
# 解析提取網(wǎng)頁中的table
.[[1]]
# 提取table
print(test_table[1:6,])
2.2 批量下載GPL數(shù)據(jù)目錄
單個(gè)頁面的數(shù)據(jù)可以下載彬檀,那批量的話帆啃,就是一個(gè)for/while循環(huán)可以解決的事情了。
首先窍帝,我們從GPL數(shù)據(jù)的第一頁努潘,來獲取當(dāng)前GPL數(shù)據(jù)條目的條目總數(shù)、總頁數(shù)坤学。
url_1st_GPL <- "https://www.ncbi.nlm.nih.gov/geo/browse/?view=platforms&sort=date&display=500&page=1"
total_number_GPL <- read_html(url_1st_GPL) %>%
html_node("#count") %>%
# "#count"來源:Chrome瀏覽器中在需要下載的數(shù)據(jù)上右鍵單擊疯坤,點(diǎn)擊檢查,彈出的頁面中拥峦,找到相應(yīng)數(shù)據(jù)贴膘,右鍵點(diǎn)擊,選擇copy selector
html_text() %>%
str_extract(pattern =
"\\d+"
) %>% as.numeric()
total_number_GPL
page_number_GPL <- read_html(url_1st_GPL) %>%
html_node(
"#page_cnt"
) %>%
html_text() %>%
as.numeric()
page_number_GPL
開始批量下載:
urls_GPL <- str_c(
"https://www.ncbi.nlm.nih.gov/geo/browse/?view=platforms&sort=date&display=500&page="
1:page_number_GPL)
urls_GPL[page_number_GPL]
創(chuàng)建一個(gè)list略号,把每個(gè)頁面中爬取的data.frame表格作為一個(gè)元素保存在list中刑峡。GEO中的數(shù)據(jù)每天都在更新,為了節(jié)約大家的時(shí)間玄柠,我已經(jīng)把大部分?jǐn)?shù)據(jù)保存為list突梦,大家需要做的就是根據(jù)這個(gè)代碼進(jìn)行數(shù)據(jù)更新了。
load("GEO_menu_lists_upto_20200503.Rda")
# 加載的數(shù)據(jù)中包含已下載的GPL_list羽利、GSE_list宫患、GPL_list,后續(xù)的所有操作都在這個(gè)的基礎(chǔ)上進(jìn)行
length(GPL_list)
length(GSE_list)
## [1] 259
length(GSM_list)
在上述數(shù)據(jù)的基礎(chǔ)上分別更新相應(yīng)的數(shù)據(jù)这弧,代碼如下:
total_number_GPL
page_number_GPL
i <- length(GPL_list)
while (i < (page_number_GPL + 1)) {
tryCatch(expr = {withTimeout(expr = { GPL_list[[i]] <- read_html(urls_GPL[i]) %>% html_table() %>% .[[1]]
# 首先更新保存的GPL_list中的最后一頁數(shù)據(jù)娃闲,然后下載新的數(shù)據(jù)
print(paste0("Page ", i, ", completed"))
i = i + 1},
timeout = 15)
# 超過15s下載不完成則重試虚汛,可根據(jù)網(wǎng)絡(luò)情況適當(dāng)調(diào)整},
error = function(e) print(paste0("For page ", i, ", try again")))
# 下載失敗時(shí),提供報(bào)錯(cuò)信息皇帮,但不停止運(yùn)行卷哩,接著再試
}
2.3 批量下載GSE數(shù)據(jù)目錄
思路及代碼同前,批量下載GSE數(shù)據(jù)目錄属拾,代碼如下:
url_1st_GSE <- "https://www.ncbi.nlm.nih.gov/geo/browse/?view=series&sort=date&display=500&page=1"
total_number_GSE <- read_html(url_1st_GSE) %>%
html_node("#count") %>% html_text() %>% str_extract(pattern = "\\d+") %>% as.numeric()
total_number_GSE
page_number_GSE <- read_html(url_1st_GSE) %>%
html_node("#page_cnt") %>% html_text() %>% as.numeric()
page_number_GSE
urls_GSE <- str_c("https://www.ncbi.nlm.nih.gov/geo/browse/?view=series&sort=date&display=500&page="
1:page_number_GSE)
urls_GSE[page_number_GSE]
i <- length(GSE_list)
while (i < (page_number_GSE + 1)) {
tryCatch(expr = {
withTimeout(expr = {
GSE_list[[i]] <- read_html(urls_GSE[i]) %>% html_table() %>% .[[1]]
# 首先更新保存的GSE_list中的最后一頁數(shù)據(jù)将谊,然后下載新的數(shù)據(jù)
print(paste0("Page ", i, ", completed"))
i = i + 1}, timeout = 15)
# 超過15s下載不完成則重試,可根據(jù)網(wǎng)絡(luò)情況適當(dāng)調(diào)整},
error = function(e) print(paste0("For page ", i, ", try again")))
# 下載失敗時(shí)渐白,提供報(bào)錯(cuò)信息尊浓,但不停止運(yùn)行,接著再試}
2.4 批量下載GSM數(shù)據(jù)目錄
思路及代碼同前纯衍,批量下載GSM數(shù)據(jù)目錄栋齿,代碼如下:
url_1st_GSM <- "https://www.ncbi.nlm.nih.gov/geo/browse/?view=samples&sort=date&display=500&page=1"
total_number_GSM <- read_html(url_1st_GSM) %>%
html_node("#count") %>%
html_text() %>%
str_extract(pattern = "\\d+") %>%
as.numeric()
total_number_GSM
## [1] 3579586
page_number_GSM <- read_html(url_1st_GSM) %>%
html_node("#page_cnt") %>%
html_text() %>% as.numeric()
page_number_GSM
## [1] 7160
urls_GSM <- str_c("https://www.ncbi.nlm.nih.gov/geo/browse/?view=samples&sort=date&display=500&page=",1:page_number_GSM)
urls_GSM[page_number_GSM]
## [1] "https://www.ncbi.nlm.nih.gov/geo/browse/?view=samples&sort=date&display=500&page=7160"
i <- length(GSM_list)
i
## [1] 7160
while (i < (page_number_GSM + 1)) {
tryCatch(expr = {
withTimeout(expr = {
GSM_list[[i]] <- read_html(urls_GSM[i]) %>% html_table() %>% .[[1]]
# 首先更新保存的GSM_list中的最后一頁數(shù)據(jù),然后下載新的數(shù)據(jù)
print(paste0("Page ", i, ", completed"))
i = i + 1}, timeout = 15)
# 超過15s下載不完成則重試托酸,可根據(jù)網(wǎng)絡(luò)情況適當(dāng)調(diào)整},
error = function(e) print(paste0("For page ", i, ", try again")))
# 下載失敗時(shí)褒颈,提供報(bào)錯(cuò)信息,但不停止運(yùn)行励堡,接著再試
}
## [1] "Page 7160, completed"
2.5 保存及更新下載的數(shù)據(jù)
保存數(shù)據(jù)為Rdata格式谷丸,下次更新可在此基礎(chǔ)上再次運(yùn)行以上代碼即可。
save(GPL_list, GSE_list, GSM_list, file =
"GEO_menu_lists_upto_20200503.Rda")
# 保存為Rda文件后应结,全部數(shù)據(jù)條目的list未超過50MB刨疼。
3. 使用R包tidyverse整理GEO菜單
R中最習(xí)慣和常用的數(shù)據(jù)格式當(dāng)然還是數(shù)據(jù)框了。下一步就是把剛剛下載的lists整理為數(shù)據(jù)框鹅龄。
3.1 整理GPL數(shù)據(jù)目錄
首先整理GPL數(shù)據(jù)揩慕,代碼如下:
GPL_all <- bind_rows(GPL_list) %>%
# 將list合并為數(shù)據(jù)框
arrange(desc(Samples)) %>%
# 按照每個(gè)GPL所有的GSM樣本數(shù)降序排列
mutate(`Release date`= mdy(`Release date`),
# 更改日期的顯示格式
across(.fns = ~ str_replace_all(.x, "\\s{2,}", " / "))
# 將數(shù)據(jù)框中的全部超過2個(gè)的連續(xù)空格替換為 /
) %>% rename_with(~ (paste0("GPL_", str_replace(.x, " ", "_"))))
# 給數(shù)據(jù)框列名統(tǒng)一重命名,加前綴GPL扮休,去掉列名中的空格
nrow(GPL_all) == total_number_GPL
## [1] TRUE
查看GPL中樣本數(shù)的Top10:
print(GPL_all[1:10, c(1, 2, 6, 7)])
3.2 整理GSE數(shù)據(jù)目錄
代碼類似迎卤,整理GSE數(shù)據(jù)框:
GSE_all <- GSE_list %>%
dplyr::bind_rows() %>%
mutate(`Release date`
= mdy(`Release date`), across(.fns = ~ str_replace_all(.x, "\\s{2,}", " / "))) %>%
rename_with(~ (paste0("GSE_", str_replace(.x, " ", "_"))))
nrow(GSE_all) == total_number_GSE
## [1] TRUE
3.3 整理GSM數(shù)據(jù)目錄
GSM_all <- GSM_list %>%
purrr::map(~ mutate(.x, across(!is.character, as.character))) %>%
# 將GSM_list中元素不是字符串類型的全部轉(zhuǎn)換為字符串
dplyr::bind_rows() %>%
# 合并數(shù)據(jù)框
dplyr::mutate(`Release date`= mdy(`Release date`),
# 更改日期格式
across(.fns = ~ str_replace_all(.x, "\\s{2,}", "/"))# 將2個(gè)以上的連續(xù)空格替換為 /)
%>% dplyr::rename_with(~ paste0("GSM_", str_replace(.x, " ", "_")))
# 重命名colnames
# 該步驟略耗時(shí),內(nèi)存小的話可能會(huì)很卡
nrow(GSM_all) == total_number_GSM
## [1] TRUE
3.4 保存清潔的GEO數(shù)據(jù)目錄
保存已整理好的數(shù)據(jù)目錄:
save(GPL_all, GSE_all, GSM_all, file ="GEO_menu_dataframes_upto_20200503.Rda")
3.5 提取感興趣的某個(gè)GSE的相關(guān)數(shù)據(jù)條目
創(chuàng)建一個(gè)函數(shù)GSE_extract玷坠,提取任意的GSE數(shù)據(jù)相關(guān)的條目:
GSE_extract <- function(GSE) {
GSE_list <- list("GSE"= NULL,
"GSM"= NULL,"GPL"= NULL)
GSE_list[[1]] <- GSE_all %>% dplyr::filter(GSE_Accession %in% GSE)
GSE_list[[2]] <- GSM_all %>% dplyr::filter(str_detect(GSM_all$GSM_Series, pattern = paste0(GSE, "\\b")))
GSE_list[[3]] <- GPL_all %>% dplyr::filter(GPL_Accession %in% unique(GSE_list[[2]]$GSM_Platform))
return(GSE_list)
}
# 示例1
GSE24206_list <- GSE_extract("GSE24206")
GSE24206_list[[1]]
GSE24206_list[[2]]
GSE24206_list[[3]]
# 示例2
GSE98131_list <- GSE_extract("GSE98131")
GSE98131_list[[1]]
GSE98131_list[[2]]
GSE98131_list[[3]]
4. 有了GEO菜單數(shù)據(jù)蜗搔,能做些什么?
數(shù)據(jù)在手八堡,各種GEO數(shù)據(jù)的統(tǒng)計(jì)分析樟凄,你值得擁有。比如兄渺,可以回答這個(gè)問題:目前測(cè)序技術(shù)很流行缝龄,那近5年還有沒有流行的表達(dá)譜芯片平臺(tái)呢?最常選擇的是?
top_array <- GSM_all %>%
select(6,7,10) %>%
filter(str_sub(GSM_Release_date, 1, 4) %in% as.character(2016:2020)) %>%
distinct( ) %>%
mutate(GPL_Accession = GSM_Platform) %>%
group_by(GPL_Accession) %>%
summarise(n = n()) %>%
arrange(desc(n)) %>%
left_join(GPL_all, by = "GPL_Accession") %>%
filter(GPL_Technology != "high-throughput sequencing") %>%
slice(1:10)
top_array[, 1:4]
Affymetrix的GPL570已經(jīng)屈居第二位了叔壤,第一名被Illumina的GPL10558平臺(tái)占領(lǐng)
如果你現(xiàn)在需要做個(gè)表達(dá)譜芯片的話瞎饲,還會(huì)糾結(jié)選擇哪個(gè)平臺(tái)嗎?
數(shù)據(jù)已在手百新,可以做的分析還有很多……
5. sessionInfo
sessionInfo()
轉(zhuǎn)自跳圈聯(lián)盟