前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用R语言读取PUBMED存入MYSQL数据库

使用R语言读取PUBMED存入MYSQL数据库

作者头像
用户1075469
发布2020-03-03 11:32:39
3.4K0
发布2020-03-03 11:32:39
举报
文章被收录于专栏:科技记者

最近,在科研狗网站看到了一个有趣的项目,使用R语言读取pubmed存入mysql数据库,之前报名没有报上,还是决心要跟着做一下,无奈R语言水平比较渣渣,只能复制别人的代码来用,悲剧的是,原代码复制过来还是报错,来一个小目标,把这段代码运行起来。花了两三天的功夫,终于实现了目标。

原代码参考自R科研作图学习小组组长:木萱小主的作业: http://group.keyangou.com/RGraph/topic/952

这个项目的难点在于要用R语言和MySQL数据库,两者都是初学,加大了难度,搞不定R函数。首先这个任务的准备工作是安装数据库和phpmyadmin(当然这只是一个选项,还有好多的图形数据库管理软件,据说大牛都是命令行操作的),这个不表。

主要步骤就是第一,用你要查询的关键词或条件获得pubmed-id,标题和摘要,然后格式化一下,放入数据库。代码如下:

代码语言:javascript
复制
library(RISmed)
代码语言:javascript
复制
cell2017<-EUtilsSummary("cell[TA] AND 2017[DP]")
代码语言:javascript
复制
data<-QueryId(cell2017)
代码语言:javascript
复制
data #获得全部的ID
代码语言:javascript
复制
pmids<-paste(data,sep = "",collapse=",")
代码语言:javascript
复制
#pmids
代码语言:javascript
复制
library(RMySQL)
代码语言:javascript
复制
library(xml2)
代码语言:javascript
复制
library(httr)
代码语言:javascript
复制
postFetchUrl<-'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?'
代码语言:javascript
复制
r2 <- POST(postFetchUrl,body = list(db='pubmed',id=pmids,retmode='xml'))
代码语言:javascript
复制
stop_for_status(r2)
代码语言:javascript
复制
data2=content(r2, "parsed")
代码语言:javascript
复制
article=xml_children(data2)
代码语言:javascript
复制
count=length(article)
代码语言:javascript
复制
cnt=1
代码语言:javascript
复制
a<-list()
代码语言:javascript
复制
b<-list()
代码语言:javascript
复制
while(cnt<=count){title=xml_find_first(article[cnt],".//ArticleTitle")
代码语言:javascript
复制
abstract=xml_find_first(article[cnt],".//AbstractText")
代码语言:javascript
复制
#write.table(xml_text(title),file='a.txt', row.names=F,quote=F,append=T)
代码语言:javascript
复制
a<-c(a,xml_text(title))
代码语言:javascript
复制
#write.table(print(xml_text(abstract)),file='b.txt',row.names=F,quote=F,append=T)
代码语言:javascript
复制
b<-c(b,xml_text(abstract))
代码语言:javascript
复制
#break
代码语言:javascript
复制
cnt = cnt + 1
代码语言:javascript
复制
}
代码语言:javascript
复制
pmid<-data
代码语言:javascript
复制
title=a
代码语言:javascript
复制
abstract<-b
代码语言:javascript
复制
title = gsub("'","",title)
代码语言:javascript
复制
abstract = gsub("'","",abstract)
代码语言:javascript
复制
article<-data.frame(pmid,title,abstract)
代码语言:javascript
复制
con<-dbConnect(MySQL(),host="127.0.0.1",dbname="rdb",user="root",password="")
代码语言:javascript
复制
dbSendQuery(con,'SET NAMES utf8')
代码语言:javascript
复制
dbWriteTable(con,"article",article,append=TRUE)
代码语言:javascript
复制
dbDisconnect(con)

用另外一种解决方法,不用RISmed包,用httpr包,也能运行,但是到第6行就会报错,只好作罢。不管怎样,上边那个方法是最简单的,用做实际应用足够了。

这里还要补充一下,如果边数据库次数太多而没有关闭会报错,有个哥们定义的函数很有用,一起放这。

代码语言:javascript
复制
#数据库连接删除函数,每个任务之前最好先清理所有的连接,调用此函数就可以
代码语言:javascript
复制
killDbConnections <- function () {
代码语言:javascript
复制
  all_cons <- dbListConnections(MySQL())
代码语言:javascript
复制
  print(all_cons)
代码语言:javascript
复制
  for(con in all_cons)
代码语言:javascript
复制
      dbDisconnect(con)
代码语言:javascript
复制
  print(paste(length(all_cons), " connections killed."))
代码语言:javascript
复制
}
代码语言:javascript
复制
killDbConnections()

代码github地址:https://github.com/zd200572/R/blob/master/科研狗

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 科技记者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档