うまく使いこなせる方法R(Rcurl/XMLパッケージ?!) このページをミ?
-
19-09-2019 - |
質問
私(やや複雑なweb scrapingに挑戦する私達成のラストラーダモールと一部の方を向いレベルで感じるように共有)こう:
いすべての種ページの"現在このリンク:
ではそれぞれについて行けます:
- 種のページのリンク(例えば: http://gtrnadb.ucsc.edu/Aero_pern/)
- そして、"二次構造"のページのリンク(例えば: http://gtrnadb.ucsc.edu/Aero_pern/Aero_pern-structs.html)
内にリンクしいスクラップのデータページになるまでの長いリストを含むこのデータ(例えば):
chr.trna3 (1-77) Length: 77 bp
Type: Ala Anticodon: CGC at 35-37 (35-37) Score: 93.45
Seq: GGGCCGGTAGCTCAGCCtGGAAGAGCGCCGCCCTCGCACGGCGGAGGcCCCGGGTTCAAATCCCGGCCGGTCCACCA
Str: >>>>>>>..>>>>.........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<....
各ラインまで独自の一覧(リスト内の各"trna"リスト内の各動物)
思い出来のパッケージRcurl、XML(R)とのできな課題です。がわからないのに使用します。いいです:1.一部提案に対しても理解しやすいようなコードです。2.や勧告を身につけるための知識が必要となどを施しています。
させ、
Tal
解決
Tal,
を使用できるとの XML
パッケージこのためには、(欲しい)にあると評HTML形成されようとしているの解析.実際、ほとんどの場合においするとのことです。 readHTMLTable()
機能 それは"この前のスレッド.
このような醜HTMLしておりますが、使用し RCurl
パッケージサンプルHTMLをいくつかのカスタム機能を解析します。この問題は二つの部品
- すべて取得し、ゲノムのURLからデータのダウンロードhttp://gtrnadb.ucsc.edu/)を使用
getURLContent()
機能のRCurl
パッケージの一部regexマジック:-) - その後このURLのリストおよびペデータのみを棒で
data.frame
.
なので、これを...
library(RCurl)
### 1) First task is to get all of the web links we will need ##
base_url<-"http://gtrnadb.ucsc.edu/"
base_html<-getURLContent(base_url)[[1]]
links<-strsplit(base_html,"a href=")[[1]]
get_data_url<-function(s) {
u_split1<-strsplit(s,"/")[[1]][1]
u_split2<-strsplit(u_split1,'\\"')[[1]][2]
ifelse(grep("[[:upper:]]",u_split2)==1 & length(strsplit(u_split2,"#")[[1]])<2,return(u_split2),return(NA))
}
# Extract only those element that are relevant
genomes<-unlist(lapply(links,get_data_url))
genomes<-genomes[which(is.na(genomes)==FALSE)]
### 2) Now, scrape the genome data from all of those URLS ###
# This requires two complementary functions that are designed specifically
# for the UCSC website. The first parses the data from a -structs.html page
# and the second collects that data in to a multi-dimensional list
parse_genomes<-function(g) {
g_split1<-strsplit(g,"\n")[[1]]
g_split1<-g_split1[2:5]
# Pull all of the data and stick it in a list
g_split2<-strsplit(g_split1[1],"\t")[[1]]
ID<-g_split2[1] # Sequence ID
LEN<-strsplit(g_split2[2],": ")[[1]][2] # Length
g_split3<-strsplit(g_split1[2],"\t")[[1]]
TYPE<-strsplit(g_split3[1],": ")[[1]][2] # Type
AC<-strsplit(g_split3[2],": ")[[1]][2] # Anticodon
SEQ<-strsplit(g_split1[3],": ")[[1]][2] # ID
STR<-strsplit(g_split1[4],": ")[[1]][2] # String
return(c(ID,LEN,TYPE,AC,SEQ,STR))
}
# This will be a high dimensional list with all of the data, you can then manipulate as you like
get_structs<-function(u) {
struct_url<-paste(base_url,u,"/",u,"-structs.html",sep="")
raw_data<-getURLContent(struct_url)
s_split1<-strsplit(raw_data,"<PRE>")[[1]]
all_data<-s_split1[seq(3,length(s_split1))]
data_list<-lapply(all_data,parse_genomes)
for (d in 1:length(data_list)) {data_list[[d]]<-append(data_list[[d]],u)}
return(data_list)
}
# Collect data, manipulate, and create data frame (with slight cleaning)
genomes_list<-lapply(genomes[1:2],get_structs) # Limit to the first two genomes (Bdist & Spurp), a full scrape will take a LONG time
genomes_rows<-unlist(genomes_list,recursive=FALSE) # The recursive=FALSE saves a lot of work, now we can just do a straigh forward manipulation
genome_data<-t(sapply(genomes_rows,rbind))
colnames(genome_data)<-c("ID","LEN","TYPE","AC","SEQ","STR","NAME")
genome_data<-as.data.frame(genome_data)
genome_data<-subset(genome_data,ID!="</PRE>") # Some malformed web pages produce bad rows, but we can remove them
head(genome_data)
この結果、データフレームを含む七つのカラムにおけるゲノム入場:ID、長さ、種類、配列、string、氏名を記入してください。名前の列を含むベースのゲノムにしたいデータの組織です。こちらを教えるという設定で次のように記述されています。
head(genome_data)
ID LEN TYPE AC SEQ
1 Scaffold17302.trna1 (1426-1498) 73 bp Ala AGC at 34-36 (1459-1461) AGGGAGCTAGCTCAGATGGTAGAGCGCTCGCTTAGCATGCGAGAGGtACCGGGATCGATGCCCGGGTTTTCCA
2 Scaffold20851.trna5 (43038-43110) 73 bp Ala AGC at 34-36 (43071-43073) AGGGAGCTAGCTCAGATGGTAGAGCGCTCGCTTAGCATGCGAGAGGtACCGGGATCGATGCCCGGGTTCTCCA
3 Scaffold20851.trna8 (45975-46047) 73 bp Ala AGC at 34-36 (46008-46010) TGGGAGCTAGCTCAGATGGTAGAGCGCTCGCTTAGCATGCGAGAGGtACCGGGATCGATGCCCGGGTTCTCCA
4 Scaffold17302.trna2 (2514-2586) 73 bp Ala AGC at 34-36 (2547-2549) GGGGAGCTAGCTCAGATGGTAGAGCGCTCGCTTAGCATGCGAGAGGtACAGGGATCGATGCCCGGGTTCTCCA
5 Scaffold51754.trna5 (253637-253565) 73 bp Ala AGC at 34-36 (253604-253602) CGGGGGCTAGCTCAGATGGTAGAGCGCTCGCTTAGCATGCGAGAGGtACCGGGATCGATGCCCGGGTCCTCCA
6 Scaffold17302.trna4 (6027-6099) 73 bp Ala AGC at 34-36 (6060-6062) GGGGAGCTAGCTCAGATGGTAGAGCGCTCGCTTAGCATGCGAGAGGtACCGGGATCGATGCCCGAGTTCTCCA
STR NAME
1 .>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<.. Spurp
2 .>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<.. Spurp
3 .>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<.. Spurp
4 >>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>.>>>.......<<<.<<<<<<<<. Spurp
5 .>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<.. Spurp
6 >>>>>>>..>>>>........<<<<.>>>>>.......<<<<<......>>>>.......<<<<.<<<<<<<. Spurp
ということで、コンから日曜日の午後のRチャレンジ!
他のヒント
ジャスト( http://www.mozenda.comする)Mozendaを使用して、それを試してみました。そして約10分後、私はあなたが説明するように、データをこすり可能性が薬を持っていました。あなただけの彼らの無料トライアルを使用して、このデータのすべてを取得することができるかもしれません。あなたは時間があればコーディングは、楽しいですが、あなたはすでにあなたのためのコード化されたソリューションを有していても良いように見えます。ニースの仕事ドリューます。
興味深い問題であり、Rは涼しいですが、何とか私はRは、この点で少し面倒なことを見つけることに同意します。私はどこかRCurlは非常にある最初のデータは、その最終的な形にしたり、データをアップロードするための準備ができている場合は、データが...すべてのステップで正しいことを確認することができるようにするために、中間プレーンテキスト形式のデータを取得することを好むように見えます便利ます。
最も簡単な私の意見はhref="http://gtrnadb.ucsc.edu/" rel="nofollow noreferrer"> HTTP(/またはcygwinの中LINUX / UNIX / Mac上)だけで全体のサイトという名前のファイルを(wgetの使用)と取る / の-structs.html、SEDまたはあなたが好きとに読み取るためにそれをフォーマットしますデータをawkはRます。
私はまた、他のたくさんの方法があるだろうと確信しています。