将HTML表转换为R数据帧 1a。我的同事对我的工作环境产生了积极的影响。 数 强烈同意 普遍同意 既不同意也不反对 一般不同意 强烈反对 没有判断的依据 案件数量 全公司 44.1 44.9 6.6 2.6 1.6 0.1 2,014 区域1 45.6 45.2 5.7 2.1 1.4 0.1 1,699 第一分部 52.9 39.7 4.1 2.5 0.8 0 121
我有一个HTML文件,其中包含了上述几种表格。我想将它们转换为一个数据框,其中每个调查问题(当前在表格标题中)将显示在一列中。回答每个问题的百分比将保留在一列中,回答水平也将保留在一列中。并非所有问题都有相同数量的回答(即,一些问题的回答量表为五分,其他问题的回答量表为九分)。我尝试了readHTMLTable,然后对该结果调用do.call rbind,但无法获得感兴趣的数据帧,因为列数不相同。我欢迎任何关于如何进行的建议。谢谢 编辑:将HTML表转换为R数据帧 1a。我的同事对我的工作环境产生了积极的影响。 数 强烈同意 普遍同意 既不同意也不反对 一般不同意 强烈反对 没有判断的依据 案件数量 全公司 44.1 44.9 6.6 2.6 1.6 0.1 2,014 区域1 45.6 45.2 5.7 2.1 1.4 0.1 1,699 第一分部 52.9 39.7 4.1 2.5 0.8 0 121,html,r,xml-parsing,dataframe,Html,R,Xml Parsing,Dataframe,我有一个HTML文件,其中包含了上述几种表格。我想将它们转换为一个数据框,其中每个调查问题(当前在表格标题中)将显示在一列中。回答每个问题的百分比将保留在一列中,回答水平也将保留在一列中。并非所有问题都有相同数量的回答(即,一些问题的回答量表为五分,其他问题的回答量表为九分)。我尝试了readHTMLTable,然后对该结果调用do.call rbind,但无法获得感兴趣的数据帧,因为列数不相同。我欢迎任何关于如何进行的建议。谢谢 编辑: 库(xml) 图书馆(dplyr) 问题您可以为此使用r
库(xml)
图书馆(dplyr)
问题您可以为此使用rvest
软件包。但是,可能需要注意带有空格的列名。我使用了选项fill=TRUE
作为快速修复,但也许可以用更好的方法来实现
library(xml)
library(dplyr)
questions<-readHTMLTable(files[8], trim=T, as.data.frame=T, header=T)
data<-bind_rows(questions)
基本上,在这种情况下,第二行的条目应该向右移动一个单元格
数据
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类(text)
#[1] “角色”
尝试使用data.table::rbindlist
和fill=TRUE
操作符,或者使用dplyr::bind_rows
(也可以填充)谢谢,这很有帮助。是否有某种方法可以始终如一地指出哪一个变量是最后一个变量,从而确保对其进行命名?一旦它们全部合并,要一致地确定哪个变量是“案例数”有点困难。您需要显示一些代码来帮助回答更详细的问题(很难假设流程的结构是什么样的,没有代码)。谢谢,这很有帮助。我的问题可能不完全明确:理想情况下,“我的同事对我的工作环境产生积极影响”将作为变量下的数据出现,这对于我试图提取的每个问题都是正确的。包是否适合该应用程序?变量文本是什么类?当我试图直接在html文件上运行代码时,以及当我使用readLines将其内容存储在字符向量中时,我遇到了一个错误(没有适用于类“c”('xml_document','xml_node')的对象的“html_table”的适用方法)。
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
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> </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\"> </A>'
#> class(text)
#[1] "character"