簡體   English   中英

將HTML表轉換為R數據幀

[英]Convert HTML tables to R data frame

<TABLE  cellspacing=1 cellpadding=7 rules=all frame=Box border=1>
<thead>
<TR>
 <TD ROWSPAN=2 ALIGN=CENTER VALIGN=CENTER>&nbsp;</TD>
 <TD COLSPAN=6 ALIGN=CENTER>1a. My peers make a positive impact my work environment.</TD>
 <TD ALIGN=CENTER>Number</TD>
</TR>
<TR>
 <TD ALIGN=CENTER>Strongly agree  <br>         </TD>
 <TD ALIGN=CENTER>Generally agree <br>         </TD>
 <TD ALIGN=CENTER>Neither agree nor<br>disagree</TD>
 <TD ALIGN=CENTER>Generally disagree<br>       </TD>
 <TD ALIGN=CENTER>Strongly disagree<br>        </TD>
 <TD ALIGN=CENTER>No basis to judge<br>        </TD>
 <TD ALIGN=CENTER>of Cases</TD>
</TR>
</thead>
<tbody>
<TR>
 <TD ALIGN=LEFT VALIGN=TOP>  Company-Wide                                     </TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>        44.1</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>        44.9</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>         6.6</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>         2.6</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>         1.6</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>         0.1</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>   2,014</TD>
</TR>
<TR>
 <TD ALIGN=LEFT VALIGN=TOP> Region 1                                 </TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>        45.6</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>        45.2</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>         5.7</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>         2.1</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>         1.4</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>         0.1</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>   1,699</TD>
</TR>
<TR>
 <TD ALIGN=LEFT VALIGN=TOP>Division 1            </TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>        52.9</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>        39.7</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>         4.1</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>         2.5</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>         0.8</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>0</TD>
 <TD ALIGN=RIGHT VALIGN=BOTTOM>     121</TD>
</TR>
</tbody>
</TABLE>
<hr><A NAME="IDX1">&nbsp;</A>

我有一個HTML文件,其中包含上面幾種類型的表。 我想將它們轉換為數據框,其中每個調查問題(當前在表格標題中)將出現在一列中。 對每個問題的響應百分比將保留在列中,響應級別也是如此。 並非所有問題都有相同數量的答案(即一些問題的評分為五分,其他問題的評分為9分)。 我嘗試了readHTMLTable,然后對該結果執行了.call rbind,但由於列數不相同而無法獲得感興趣的數據幀。 我歡迎任何關於如何進行的建議。 謝謝!

編輯:

library(xml)
library(dplyr)
questions<-readHTMLTable(files[8], trim=T, as.data.frame=T, header=T)
data<-bind_rows(questions)

我想要的數據框中的結果,但由於某些問題的響應級別高於其他問題,因此“案例數”數據不會始終出現在一列中。 有沒有辦法讓我在合並之前命名每個表的最后一列?

你可以使用rvest包。 但是,可能需要注意帶有空格的列名。 我使用選項fill=TRUE作為快速修復,但也許這可以以更好的方式完成。

library(rvest)
my_df <- as.data.frame(read_html(text) %>% html_table(fill=TRUE))
> my_df
#              X1                                                       X2                        X3                 X4                X5                X6       X7     X8
#1                1a. My peers make a positive impact my work environment.                      <NA>               <NA>              <NA>              <NA>     <NA> Number
#2 Strongly agree                                          Generally agree Neither agree nordisagree Generally disagree Strongly disagree No basis to judge of Cases   <NA>
#3   Company-Wide                                                     44.1                      44.9                6.6               2.6               1.6      0.1  2,014
#4       Region 1                                                     45.6                      45.2                5.7               2.1               1.4      0.1  1,699
#5     Division 1                                                     52.9                      39.7                4.1               2.5               0.8        0    121

關於數據,我使用單引號將來自OP的html代碼復制粘貼並將其分配給帶有text <- '<TABLE cellspacing=1 cellpadding=7 rules=all frame=...'的變量text

之后可以通過一種相當簡單的方式糾正格式的一些細節:

my_df[2,] <- c("",my_df[2,][-length(my_df)])
#> my_df
#            X1                                                       X2              X3                        X4                 X5                X6                X7       X8
#1              1a. My peers make a positive impact my work environment.            <NA>                      <NA>               <NA>              <NA>              <NA>   Number
#2                                                        Strongly agree Generally agree Neither agree nordisagree Generally disagree Strongly disagree No basis to judge of Cases
#3 Company-Wide                                                     44.1            44.9                       6.6                2.6               1.6               0.1    2,014
#4     Region 1                                                     45.6            45.2                       5.7                2.1               1.4               0.1    1,699
#5   Division 1                                                     52.9            39.7                       4.1                2.5               0.8                 0      121

基本上,在這種情況下,第二行的條目應該向右移動一個單元格。

數據

text <- '<TABLE  cellspacing=1 cellpadding=7 rules=all frame=Box border=1>\n  <thead>\n  <TR>\n  <TD ROWSPAN=2 ALIGN=CENTER VALIGN=CENTER>&nbsp;</TD>\n    <TD COLSPAN=6 ALIGN=CENTER>1a. My peers make a positive impact my work environment.</TD>\n      <TD ALIGN=CENTER>Number</TD>\n        </TR>\n        <TR>\n        <TD ALIGN=CENTER>Strongly agree  <br>         </TD>\n          <TD ALIGN=CENTER>Generally agree <br>         </TD>\n            <TD ALIGN=CENTER>Neither agree nor<br>disagree</TD>\n              <TD ALIGN=CENTER>Generally disagree<br>       </TD>\n                <TD ALIGN=CENTER>Strongly disagree<br>        </TD>\n                  <TD ALIGN=CENTER>No basis to judge<br>        </TD>\n                    <TD ALIGN=CENTER>of Cases</TD>\n                      </TR>\n                      </thead>\n                      <tbody>\n                      <TR>\n                      <TD ALIGN=LEFT VALIGN=TOP>  Company-Wide                                     </TD>\n                        <TD ALIGN=RIGHT VALIGN=BOTTOM>        44.1</TD>\n                          <TD ALIGN=RIGHT VALIGN=BOTTOM>        44.9</TD>\n                            <TD ALIGN=RIGHT VALIGN=BOTTOM>         6.6</TD>\n                              <TD ALIGN=RIGHT VALIGN=BOTTOM>         2.6</TD>\n                                <TD ALIGN=RIGHT VALIGN=BOTTOM>         1.6</TD>\n                                  <TD ALIGN=RIGHT VALIGN=BOTTOM>         0.1</TD>\n                                    <TD ALIGN=RIGHT VALIGN=BOTTOM>   2,014</TD>\n                                      </TR>\n                                      <TR>\n                                      <TD ALIGN=LEFT VALIGN=TOP> Region 1                                 </TD>\n                                        <TD ALIGN=RIGHT VALIGN=BOTTOM>        45.6</TD>\n                                          <TD ALIGN=RIGHT VALIGN=BOTTOM>        45.2</TD>\n                                            <TD ALIGN=RIGHT VALIGN=BOTTOM>         5.7</TD>\n                                              <TD ALIGN=RIGHT VALIGN=BOTTOM>         2.1</TD>\n                                                <TD ALIGN=RIGHT VALIGN=BOTTOM>         1.4</TD>\n                                                  <TD ALIGN=RIGHT VALIGN=BOTTOM>         0.1</TD>\n                                                    <TD ALIGN=RIGHT VALIGN=BOTTOM>   1,699</TD>\n                                                      </TR>\n                                                      <TR>\n                                                      <TD ALIGN=LEFT VALIGN=TOP>Division 1            </TD>\n                                                        <TD ALIGN=RIGHT VALIGN=BOTTOM>        52.9</TD>\n                                                          <TD ALIGN=RIGHT VALIGN=BOTTOM>        39.7</TD>\n                                                            <TD ALIGN=RIGHT VALIGN=BOTTOM>         4.1</TD>\n                                                              <TD ALIGN=RIGHT VALIGN=BOTTOM>         2.5</TD>\n                                                                <TD ALIGN=RIGHT VALIGN=BOTTOM>         0.8</TD>\n                                                                  <TD ALIGN=RIGHT VALIGN=BOTTOM>0</TD>\n                                                                    <TD ALIGN=RIGHT VALIGN=BOTTOM>     121</TD>\n                                                                      </TR>\n                                                                      </tbody>\n                                                                      </TABLE>\n                                                                      <hr><A NAME=\"IDX1\">&nbsp;</A>'
#> class(text)
#[1] "character"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM