R科研作图学习小组

http://group.keyangou.com/RGraph
组长: 管理员:
  • 访问次数:29848
  • 小组等级:9
  • 话题:593
  • 回答:39
  • 签到:445
  • 小组排名:
  • R2-01-第二期-2 R读取pubmed存入mysql数据库

    木萱小主 发布于:2018.01.24

    任务1

    完成mysql安装,并调试。尝试导入数据

    con <- dbConnect(MySQL(),host="localhost",dbname="rdb",user="root",password="")
    t_demo<-data.frame(a=seq(1:10), b=letters[1:10], c=rnorm(10))
    t_demo
    dbWriteTable(con, "t_demo", t_demo)

    1.jpg

    任务2

    #任务2.获得cell杂志2017年所有文章的id
    install.packages("RISmed")
    library(RISmed)
    cell2017<-EUtilsSummary("cell[TA] AND 2017[DP]")
    data<-QueryId(cell2017)
    data #获得全部的ID
    pmids<-paste(data,sep = "",collapse=","),字符串用分号间隔

    任务3 #任务3:通过efetch接口获取title和abstract
    library(RMySQL)
    library(xml2)
    library(httr)
    postFetchUrl<-'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?'
    r2 <- POST(postFetchUrl,body = list(db='pubmed',id=pmids,retmode='xml'))
    stop_for_status(r2)
    data2=content(r2, "parsed")
    article=xml_children(data2)
    count=length(article)
    cnt=1
    while(cnt<=count){title=xml_find_first(article[cnt],".//ArticleTitle")
    abstract=xml_find_first(article[cnt],".//AbstractText")
    write.table(print(xml_text(title)),file='D:/a.txt',row.names=F,quote=F,append=T)
    write.table(print(xml_text(abstract)),file='D:/b.txt',row.names=F,quote=F,append=T)
    cnt = cnt + 1
    }

    先用txt做一个吧,RMySQL没整出来,有空再接着做

    a<-read.csv(file.choose(),header=T)
    b<-read.csv(file.choose(),header=T)
    c<-data
    article<-data.frame(pmid=c,title=a,abstract=b)
    con<-dbConnect(MySQL(),host="localhost",dbname="rdb",user="root",password="")
    dbSendQuery(con,'SET NAMES utf8')
    dbWriteTable(con, "article2", article) #先弄一个article2 以后用RMySQL再弄article
    2.jpg

     重建一个数据库“”rdb2“”

    con<-dbConnect(MySQL(),host="localhost",dbname="rdb2",user="root",password="")
    dbSendQuery(con,'SET NAMES utf8')
    输出:<MySQLResult:2,2,0>

     清理所有的连接

    killDbConnections()

    输出:[[1]]<MySQLConnection:0,0>

    [[2]]
    <MySQLConnection:0,1>

    [[3]]
    <MySQLConnection:0,2>

    [1] "3  connections killed."
    Warning messages:
    1: Closing open result sets
    2: Closing open result sets

    任务2

    con<-dbConnect(MySQL(),host="localhost",dbname="rdb2",user="root",password="")
    dbSendQuery(con,'SET NAMES utf8')
    library(httr)
    totalNum=562
    pageSize=10
     totalPage=ceiling(totalNum/pageSize)
    currentPage=1
    term='(cell[TA]) AND 2017[DP]'
    Url='https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi'
    while(currentPage<=totalPage){
      retstart=(currentPage-1)*pageSize
      r <- POST(Url,
                body = list(
                  db='pubmed',
                  term=term,
                  retmode='json',
                  retstart=retstart,
                  retmax=pageSize,
                  usehistory=usehistory,
                  rettype='uilist'
                )
      )
       
      stop_for_status(r)
      data=content(r, "parsed", "application/json")
      esearchresult=data$esearchresult
      idlist =esearchresult$idlist
      n = length(idlist)
      pmid=c()
      i = 1
      while(i<=n){
        pmid=c(pmid, as.character(idlist[i][1]))
        i = i+1
      }
       article=data.frame('pmid'=pmid)
       dbWriteTable(con,"article",article,append=TRUE)
       currentPage = currentPage + 1
    }
    #close

    dbDisconnect(con)

    火狐截图_2018-03-01T11-43-52_211Z.png

    任务3

    library(xml2)
    con <- dbConnect(MySQL(),host="localhost",dbname="rdb2",user="root",password="")
    dbSendQuery(con,'SET NAMES utf8')
    nb<- dbSendQuery(con, "SELECT * FROM article WHERE isdone=0")
    ()()()while (!dbHasCompleted(nb)) {
      chunk <- dbFetch(nb, 10)
      pmidStr=""
      i=1
      n=nrow(chunk) #获得总行数
      while (i<=n){
        pmidStr = paste(pmidStr,chunk[i,3],sep=",") #循环将各个pmid之间用逗号连接起来
        i = i + 1
      }
      pmidStr=substr(pmidStr,2,100000) #去掉pmid第一个逗号,从第2位起,到100000位,即到末尾()()()()()()()()()()()()()))))

    ???貌似更容易些  pmids<-paste(data,sep = "",collapse=","),字符串用分号间隔



      #下面就是第一次作业里面获取title和abstract
     Url='https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi'
      r2 <- POST(Url,
                 body = list(
                   db='pubmed',
                   id=pmidStr,
                   retmode='xml'
                 )
      )
      stop_for_status(r2)
      data2=content(r2, "parsed", "application/xml")
      article=xml_children(data2)
      count=length(article)
      cnt=1
      while(cnt<=count){
        title=xml_text(xml_find_first(article[cnt],".//ArticleTitle"))
        abstract=xml_text(xml_find_first(article[cnt],".//AbstractText"))
        pmid=xml_text(xml_find_first(article[cnt],".//PMID"))
        title = gsub("'","",title)
        abstract = gsub("'","",abstract)
        sql=paste("UPDATE article SET title='",title,"',abstract='",abstract,"',isdone=1"," where pmid='",pmid,"'",sep="")

        con2 <- dbConnect(MySQL(),host="localhost",dbname="rdb2",user="root",password="")
        dbSendQuery(con2,'SET NAMES utf8')
        dbSendQuery(con2,sql)
        dbDisconnect(con2)
        cnt = cnt + 1
        Sys.sleep(1)
      }
    }

    火狐截图_2018-03-01T11-54-51_834Z.png 

     
    2条评论 456浏览 邀请回答

    真·科研狗 回答于:2018年01月26日 14:07:271楼

     北京大学 医学部基础医学院 细胞生物学 博士 

    RISmed可以简单的获得pubmed的数据,建议学习下不用这个包的方法,因为这个包也只是针对pubmed,如果是另外一个接口网站呢?还有一个问题,这个获取ID以及title和abstract是一次性获取不?如果让你获取的记录有1000万个呢,一次性获取肯定不可行吧。学习下循环分页获取,这对后面大量的数据处理是有用的

    木萱小主 回答于:2018年01月26日 16:16:392楼

    北京 北京协和医学院 微生物与生化药学博士 

    恩恩,是的呢,有点投机取巧了,一会就用另一个方法弄一下,之前没捣鼓出来。


    小组告示

    科研狗 2012-2016 京ICP备16006621 科研好助手,专业的科研社交共享平台