RとSQLiteで気軽に
 データベース作成

antiplastics@Kashiwa.R#4
         2012/9/28
テーブルデータの限界


      4.39GBのデータを
      read.table()



webから取得した
シロイヌナズナの
遺伝子発現データ




                     堅気の人はまず見る事が無いエラーメッセージ
データをどう管理するか
                              RDBMS
- リレーショナルデータベースマネージメントシステム
- データを関係モデルで管理
- MySQL, PostgreSQL, Oracle, SQLite等




                     テーブル2

                             テーブル3

            テーブル1
データをどう管理するか
                            NoSQL
               最近注目されているRDBMSと異なる技術

キー・バリュー型 : データを単純に“キー”と“値”を持つものとして管理
- Cassandra(前までfacebookが使ってた), Google BigTable, Amazon
DynamoDB等
   keyX     124      keyX      526      keyX   9579
   keyY     ABAV     keyY      DHHD     keyY   DHAS      ・・・
   keyZ     tes352   keyZ      fsj574   keyZ   sutr325



ドキュメント志向型 : データをXML, JSON等で書かれたドキュメントとして管理
- MongoDB, CouchDB, Xquery等


                                 XML
                                XML
                               XML
                              XML
                             XML
データを取得する
言わずもがなの文献データベース                                     雑誌毎にフォルダ分けされており、
XML形式で文献データを提供                                      中身は月毎にファイルを分けている
(http://www.ncbi.nlm.nih.gov/pmc/tools/ftp/)              (XML)




                      ダウンロード             解凍
                       (7時間!)         (34.1GB!!!)
補足:スキーマ
         テーブルをどのように分割するか、
           どのキー同士で参照するか、
          どこにインデックスを貼るか…等
           データベース全体のデザイン



        テーブル2
                        今回はI/Oが早くなればそれでいいので、
                テーブル3
                           特にスキーマとか考えない
テーブル1                        (1個のでかいテーブル)
補足:スキーマ
ゲノムデータベースEnsemblのスキーマ




        あまりにアレだからBiomartがもっと簡単に
        データを取得できるようにしている
補足:SQLite
                          RDBMSの一種で、サーバーvsクライアントという概念が無い
                                SQLの文法はMySQLとかと大体は同じ
                         → 個人で気軽にローカルのデータベースを構築するのに最適




                                                                                 隠しファイル

Macだと                                         Macだと
/Users/ユーザー名/Library/Application              /Users/ユーザー名/Library/Application    Macだと
Support/Firefox/Profiles/307dewum.default/    Support/Skype/アカウント名/               /Users/ユーザー名/.dropbox



        他にもあらゆるアプリケーションが利用 (http://www.sqlite.org/famous.html)
XML→CSV
library(XML)
d <- xmlToList(“XMLファイル名”)                                  みたいなのを毎回走らせる
A <- d$front$’journal-meta’$’journal-id’$text               のはダルいから、
B <- d$front$’article-meta’$’pub-date’$year                 実際はシェルスクリプトで
C <- d$front$’article-meta’$’title-group’$’article-title’
D <- d$front$’article-meta’$’abstract$p
E <- paste(“PMC”,d$front$’article-meta’$’article-id’$text,sep=“”)
F <-paste(“http://www.ncbi.nlm.nih.gov/pmc/articles/”,E,”/pdf/”,sep=“”)

…
result <- c(A,B,C,D,E,F)
sink(file=“pubmed.txt”,append=T)
cat(result)
sink()

                        このようなtab区切りテーブルpubmed.txtができる
       雑誌名      年代     タイトル アブスト (???GB)
                                    PMCID      URL
       Nature   2012   hoge        Hoge is...   PMC2751374   http://www.ncbi.nlm.......
SQLiteにCSVをインポート
> sqlite3 pubmed.sqlite
sqlite> DROP TABLE IF EXISTS pubmed.sqlite;
sqlite> CREATE TABLE pubmed (
        journal_name VARCHAR(30),
        year INTEGER,
        title VARCHAR(300),                   pubmed.sqlite
        abst VARCHAR(5000),
        pmcid CHAR(10),
        url VARCHAR(100)
                                              完成!!!
        );
Sqlite> .separator ¥t
sqlite> .import pubmed.txt pubmed
sqlite> .exit
RSQLite
       RでSQLiteを操作できるパッケージ
   Rでコマンドを叩いても、実際は裏でSQLが走る
SQLがデータをとってきても、返ってくるのはRオブジェクト


               SQL文
       例: SELECT * FROM pubmed;

                               pubmed.sqlite


              Rオブジェクト
             (データフレーム)


DBI(データベースインターフェース)という
他の言語でも実装されている
 例: PerlのDBD::Pg、JavaのJDBI、Rubyのruby-dbi
検索してみる


dbGetQuery(con,"SELECT title FROM pubmed WHERE abst like '%RNA-Seq%';")




Microarrays, deep sequencing and the true…
Maintaining RNA integrity in a …
Microarrays and RNA-Seq identify molecular mechanisms…
                      ・
                      ・
                      ・                 このタイトルのものは、アブストに
                                        RNA-Seqの事が書かれている
集計してみる

dbGetQuery(con,"SELECT COUNT(*) FROM pubmed WHERE abst like '%RNA-Seq%';")




               アブストにRNA-Seqと書かれた論文は167件!
可視化
paper <- rep(0:0,length=85)
for(i in 1928:2012){
command <- paste("SELECT COUNT(*) FROM pubmed WHERE abst like '%RNA-Seq%' AND year = ",i,";",sep="")
prepaper <- dbGetQuery(con,command)
if(as.numeric(prepaper)!=0){
  paper[i-1928] <- as.numeric(prepaper)
}
}
jpeg(file="paper.jpeg")
plot(1928:2012,paper,"l",ylab="Frequency",xlab="Year")
dev.off()




    論文の本数が2000年後半あたりにい
    きなり急増している!
可視化




“RNA-Seq”,“microarray”,“RT-PCR”,“Western blot”,“two-hybrid”,“GFP”の6
実験手法のアブスト内での出現頻度(ノードの大きさ)と、共起頻度(エッジの
短さ)をCytoscapeで可視化
pdf根こそぎダウンロード
  keyword <- "RNA-Seq"

  url <- as.matrix(dbGetQuery(con,paste("SELECT url FROM pubmed WHERE abst
  like '%",keyword,"%';",sep="")))
  url <- sub(" ","",url)
  d <- getwd()
  dir.create(paste(d,"/",keyword,sep=""))
  setwd(paste(d,"/",keyword,sep=""))
  for(i in 1:length(url)){
  call <- paste(i,"/",length(url), "is now downloading...",sep=" ")
  print(call)
  filename <- paste(i,".pdf",sep="")
  download.file(url=url[i],destfile=filename,quiet=T)
  }
  setwd(d)




RNA-Seqというキーワードがアブストに
ある文献を一度にダウンロード
その他

• web上の既存のDBにアクセスもできる
  (Rパッケージガイドブック参照)
まとめ
• 大規模データの扱いはRDBMS

• データ解析はR

• RSQLiteで美味しいとこどりできる

• 書いたソースコードは以下にあるのでご自由に
  https://sites.google.com/site/scriptofbioinformatics/
  sql-guan-xi/pubmednodetabesu-gou-zhu-r-sqlite
参考
二階堂さんのサイト
http://cat.hackingisbelieving.org/bioinfo_tips/Learning-sqlite3.html


DBOnline
http://www.dbonline.jp/sqlite/


sqliteコマンド 基本的な使い方
http://aaabbbkirai.sytes.net/wiki/tech/db/sqlite%A5%B3%A5%DE%A5%F3%A
5%C9%20%B4%F0%CB%DC%C5%AA%A4%CA%BB%C8%A4%A4%CA%F
D.html#p2994141


RSQLite Reference manual
http://cran.r-project.org/web/packages/RSQLite/RSQLite.pdf


Rパッケージガイドブックの@wakutekaが書いたとこ

RとSQLiteで気軽にデータベース作成