在一个形状奇特的HTML表中读到R

时间:2013-04-05 19:34:42

标签: html r dataframe html-table

我有一些日志补充数据的离线html文件。它的格式是一对一行/条目,一些列被拆分,例如:

OrganismID  GeneID

Org1        Gene1
____________
Org2        Gene1
            Gene2
___
Org3        Gene2
            Gene3
            Gene4  

因此,对于OrganismID,该列有3行,但GeneID列有一行对应于OrganismID的第一行,2行对应于第二行的OrganismID,三行对应于第三行的OrganismID。因此,当您在文档中的表中拆分单元格时,它看起来就像。我如何才能将其转换为 R ,并且可能会将其转换为更好的格式,例如传统的 R data.frame?

编辑:

我已经包含了前几个条目的HTML代码,这些条目可以很好地显示表的列如何具有不同的行。我不是最新的HTML,但他们似乎通过声明rowspan在第1列的每一行的开头定义它,为第4和第5列中的多行“腾出空间”:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Overview per Gene</title>
</head>
<body>
<table border="1">
<tr>
<th>Species</th>
<th>Gene ID</th>
<th>Length Upstream</th>
<th>Motif ID</th>
<th>Position</th>
<th>Strand</th>
<th>Match</th>
</tr>
<tr>
<td rowspan="2">P. infestans</td>
<td rowspan="2">PITG_00002</td>
<td rowspan="2">1000</td>
<td>Motif-0</td>
<td>-574</td>
<td>-</td>
<td>TCAGTCTTACATCTAC</td>
</tr>
<tr>
<td>Motif-1</td>
<td>-430</td>
<td>-</td>
<td>GTTACATGAAG</td>
</tr>
<tr>
<td rowspan="1">P. infestans</td>
<td rowspan="1">PITG_00004</td>
<td rowspan="1">454</td>
<td>Motif-1</td>
<td>-264</td>
<td>+</td>
<td>TACATGTAA</td>
</tr>
<tr>
<td rowspan="2">P. infestans</td>
<td rowspan="2">PITG_00006</td>
<td rowspan="2">1000</td>
<td>Motif-0</td>
<td>-55</td>
<td>+</td>
<td>CATTCCTAATTTCGCC</td>
</tr>
<tr>
<td>Motif-1</td>
<td>-326</td>
<td>+</td>
<td>CATATATGTATGG</td>
</tr>
<tr>
<td rowspan="3">P. infestans</td>
<td rowspan="3">PITG_00009</td>
<td rowspan="3">1000</td>
<td>Motif-0</td>
<td>-413</td>
<td>-</td>
<td>TCACTTCTCTACTTTG</td>
</tr>
<tr>
<td>Motif-1</td>
<td>-31</td>
<td>+</td>
<td>TACATGTAC</td>
</tr>
<tr>
<td>Motif-3</td>
<td>-271</td>
<td>-</td>
<td>TACTTGGAATTTGTAT</td>
</tr>
<tr>

1 个答案:

答案 0 :(得分:4)

我对您的HTML代码做了一些更正,例如我已关闭<table><body><html>,我使用XML包来阅读此表。我注意到在某些情况下列的顺序不正确,但您可以在阅读此表后修复。

我的主张如下。

library(XML)

a<-'<html>
    <head>
    <title>Overview per Gene</title>
    </head>
    <body>
    <table border="1">
    <tr>
    <th>Species</th>
    <th>Gene ID</th>
    <th>Length Upstream</th>
    <th>Motif ID</th>
    <th>Position</th>
    <th>Strand</th>
    <th>Match</th>
    </tr>
    <tr>
    <td rowspan="2">P. infestans</td>
    <td rowspan="2">PITG_00002</td>
    <td rowspan="2">1000</td>
    <td>Motif-0</td>
    <td>-574</td>
    <td>-</td>
    <td>TCAGTCTTACATCTAC</td>
    </tr>
    <tr>
    <td>Motif-1</td>
    <td>-430</td>
    <td>-</td>
    <td>GTTACATGAAG</td>
    </tr>
    <tr>
    <td rowspan="1">P. infestans</td>
    <td rowspan="1">PITG_00004</td>
    <td rowspan="1">454</td>
    <td>Motif-1</td>
    <td>-264</td>
    <td>+</td>
    <td>TACATGTAA</td>
    </tr>
    <tr>
    <td rowspan="2">P. infestans</td>
    <td rowspan="2">PITG_00006</td>
    <td rowspan="2">1000</td>
    <td>Motif-0</td>
    <td>-55</td>
    <td>+</td>
    <td>CATTCCTAATTTCGCC</td>
    </tr>
    <tr>
    <td>Motif-1</td>
    <td>-326</td>
    <td>+</td>
    <td>CATATATGTATGG</td>
    </tr>
    <tr>
    <td rowspan="3">P. infestans</td>
    <td rowspan="3">PITG_00009</td>
    <td rowspan="3">1000</td>
    <td>Motif-0</td>
    <td>-413</td>
    <td>-</td>
    <td>TCACTTCTCTACTTTG</td>
    </tr>
    <tr>
    <td>Motif-1</td>
    <td>-31</td>
    <td>+</td>
    <td>TACATGTAC</td>
    </tr>
    <tr>
    <td>Motif-3</td>
    <td>-271</td>
    <td>-</td>
    <td>TACTTGGAATTTGTAT</td>
    </tr>
    </table>
    </body>
    </html>'

doc<-htmlParse(a)
tab<-readHTMLTable(doc,which=1)
idx<-which(is.na(tab$Match))
lapply(tab,class)
for (i in 1:ncol(tab)){
  tab[,i]<-as.character(tab[,i])
}
tab[idx,c(4:7)]<-tab[idx,c(1:4)]
tab[idx,c(1:3)]<-NA

和结果

tab
       Species    Gene ID Length Upstream Motif ID Position Strand            Match
1 P. infestans PITG_00002            1000  Motif-0     -574      - TCAGTCTTACATCTAC
2         <NA>       <NA>            <NA>  Motif-1     -430      -      GTTACATGAAG
3 P. infestans PITG_00004             454  Motif-1     -264      +        TACATGTAA
4 P. infestans PITG_00006            1000  Motif-0      -55      + CATTCCTAATTTCGCC
5         <NA>       <NA>            <NA>  Motif-1     -326      +    CATATATGTATGG
6 P. infestans PITG_00009            1000  Motif-0     -413      - TCACTTCTCTACTTTG
7         <NA>       <NA>            <NA>  Motif-1      -31      +        TACATGTAC
8         <NA>       <NA>            <NA>  Motif-3     -271      - TACTTGGAATTTGTAT