2017-04-12 108 views
0

我試圖找到一個使用rentrez包的PubMed條目的SNP列表。當我運行下面的代碼時,我最終得到一個NULL數據框。我認爲我沒有正確編寫數據框。將數據存儲在數據幀中for循環 - rentrez

library(rentrez) 

term <- c('AKR1C1[GENE] AND snp_pubmed[Filter] AND Homo sapiens[Organism]', 
'AKR1C2[GENE] AND snp_pubmed[Filter] AND Homo sapiens[Organism]') 

p.snps <- for (i in seq_along(term)) { 
    entrez_search(db="SNP", 
       term = i, 
       usehistory = "y" 
       ) 
} 

我想這樣做大約100個基因。

+1

'for'循環不會存儲結果。你可以考慮'p.snps < - lapply(seq_along(term),function(i)entrez_search(...))'。 – r2evans

回答

2

問題

有幾個問題:

  • for循環不返回值
  • 的第二個參數entrez_search應該是代表在期限,但代碼中的字符串問題通過它一個數
  • 該問題是指一個數據幀,但自然的方式返回這是一個列表"esearch"個對象(儘管這可能會進一步轉化)。

更正代碼

嘗試這種情況:

p.snps <- vector(length = length(term), mode = "list") 

for (i in seq_along(term)) { 
    p.snps[[i]] <- entrez_search(db = "SNP", term = term[i], history = "y") 
} 
names(p.snps) <- term 

較短替代 或全部在一個行:

p.snps <- sapply(term, entrez_search, db = "SNP", usehistory = "y", simplify = FALSE) 

龍形式數據FRAM Ë

這個名單可以轉換成ids長的表單數據幀與第二列給出查詢:

ids <- lapply(p.snps, "[[", "ids") 
stack(ids) 

,並提供:

 values               ind 
1 41314625 AKR1C1[GENE] AND snp_pubmed[Filter] AND Homo sapiens[Organism] 
2 17344137 AKR1C1[GENE] AND snp_pubmed[Filter] AND Homo sapiens[Organism] 
3 11548049 AKR1C1[GENE] AND snp_pubmed[Filter] AND Homo sapiens[Organism] 
4 7097713 AKR1C1[GENE] AND snp_pubmed[Filter] AND Homo sapiens[Organism] 
...etc... 

如果你寧願指數值( 1,2,...)而不是查詢字符串在stack聲明之前運行此語句:

names(ids) <- seq_along(ids) 

在這種情況下,堆棧語句的輸出將是:

 values ind 
1 41314625 1 
2 17344137 1 
3 11548049 1 
4 7097713 1 
5 3930965 1 
6 3763675 1 
...etc... 
+0

這正是我正在尋找的。我認爲一個'sapply'或'lapply'方法可能是最好的。謝謝! – JoeShmo