我正在尝试将html数据表拉入单个数据框中,并且正在寻找一种优雅的解决方案。有255个表格,网址有两个变量:Year和Aldermanic District。我知道必须有一种用于循环或其他方法的方法,但是我很困惑。
我已经用一行单独的代码读取了每个表,从而成功导入了数据,但这导致每个表都占一行,并且又有255个表。
library(XML)
data <- bind_rows(readHTMLTable("http://assessments.milwaukee.gov/SalesData/2018_RVS_Dist14.htm", skip.rows=1),
readHTMLTable("http://assessments.milwaukee.gov/SalesData/2017_RVS_Dist14.htm", skip.rows=1),
readHTMLTable("http://assessments.milwaukee.gov/SalesData/2016_RVS_Dist14.htm", skip.rows=1),
readHTMLTable("http://assessments.milwaukee.gov/SalesData/2015_RVS_Dist14.htm", skip.rows=1),
理想情况下,我可以使用for
循环之类的东西,这样我就不必为每个表手动编写readHTMLTable
函数的代码。
答案 0 :(得分:1)
您可以尝试创建一个包含所有要抓取的URL的向量,然后使用for
循环遍历这些输入:
url1 <- "http://assessments.milwaukee.gov/SalesData/"
url2 <- "_RVS_Dist"
years <- c(2015:2018)
dist <- c(1:15)
urls <- apply(expand.grid(paste0(url1, years), paste0(url2, dist)), 1, paste, collapse="")
data <- NULL
for (url in urls) {
df <- readHTMLTable(url)
data <- rbind(data, df)
}
答案 1 :(得分:1)
我们可以使用map_dfr
包(purrr
的一部分)中的tidyverse
在整个URL上应用readHTMLTable
函数。关键是要识别与每个URL不同的部分。在这种情况下,2015:2018
是唯一更改的内容,因此我们可以使用paste0
来构造URL。 map_dfr
将自动组合所有数据帧以返回一个组合数据帧。 dat
是最终输出。
library(tidyverse)
library(XML)
dat <- map_dfr(2015:2018,
~readHTMLTable(paste0("http://assessments.milwaukee.gov/SalesData/",
.x,
"_RVS_Dist14.htm"), skip.rows = 1)[[1]])
更新
这里是扩展年份和数字之间的组合,然后使用map2_dfr
下载数据的方法。
url <- expand.grid(Year = 2002:2018, Number = 1:15)
dat <- map2_dfr(url$Year, url$Number,
~readHTMLTable(paste0("http://assessments.milwaukee.gov/SalesData/",
.x,
"_RVS_Dist",
.y,
".htm"), skip.rows = 1)[[1]])