一網(wǎng)打盡GEO數(shù)據(jù)集全目錄信息

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
  1. 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ù)條目:

image.png

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ù)量等信息坎吻。


image.png
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è)置僵朗。

image.png
1.3 GSE目錄

GSE目錄同上赖欣,包含了GSE編號(hào)、GSE標(biāo)題验庙、GSE數(shù)據(jù)的類型顶吮、該GSE的樣本數(shù)量、以及對(duì)應(yīng)的GDS鏈接粪薛、補(bǔ)充文件的格式云矫、聯(lián)系方式以及該GSE的發(fā)布日期。

image.png
1.4 GSM目錄

GSM目錄包含了所有GSM數(shù)據(jù)編號(hào)汗菜、GSM標(biāo)題让禀、GSM數(shù)據(jù)類型、物種陨界、發(fā)布日期等信息巡揍。


image.png

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)盟

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末企软,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子饭望,更是在濱河造成了極大的恐慌,老刑警劉巖形庭,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铅辞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡萨醒,警方通過查閱死者的電腦和手機(jī)斟珊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來富纸,“玉大人囤踩,你說我怎么就攤上這事∠剩” “怎么了堵漱?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)涣仿。 經(jīng)常有香客問我勤庐,道長(zhǎng),這世上最難降的妖魔是什么好港? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任愉镰,我火速辦了婚禮,結(jié)果婚禮上钧汹,老公的妹妹穿的比我還像新娘丈探。我一直安慰自己,他們只是感情好拔莱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布碗降。 她就那樣靜靜地躺著,像睡著了一般辨宠。 火紅的嫁衣襯著肌膚如雪遗锣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天嗤形,我揣著相機(jī)與錄音精偿,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛笔咽,可吹牛的內(nèi)容都是我干的搔预。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叶组,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼拯田!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起甩十,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤船庇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后侣监,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸭轮,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年橄霉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窃爷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姓蜂,死狀恐怖按厘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钱慢,我是刑警寧澤逮京,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站滩字,受9級(jí)特大地震影響造虏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜麦箍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一漓藕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挟裂,春花似錦享钞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渠啤,卻和暖如春狐肢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沥曹。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工份名, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碟联,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓僵腺,卻偏偏與公主長(zhǎng)得像鲤孵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辰如,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354