2017-04-12 10 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の二番目の引数は、中の用語が、コードを表す文字列でなければなりません質問はそれに数値を渡します
  • 質問はデータフレームを参照していますが、これを返す自然な方法はのリストです10個のオブジェクト(これは後でさらに変形することができるが)。

修正されたコード

これを試してみてください:

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 

短い代替 またはすべてを1行で:

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

ロングフォームデータのFRAMを(

 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... 

あなたではなく、インデックス値を持っている希望の場合:

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

を与える:電子

は、クエリを与えて二列にidsの長い形式のデータフレームにこのリストを変換するには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

これはまさに私が探していたものです。私は、「サプリー」や「ラブリー」のアプローチがベストかもしれないと考えていました。ありがとう! – JoeShmo

関連する問題