我正在尝试将html数据表拉入单个数据框,我正在寻找一个优雅的解决方案。共有255个表格,网址因两个变量而异:年份和Aldermanic区域。我知道必须有一种方法可以用于循环或其他东西,但我很难过。
我已经通过使用单独的代码行读取每个表来成功导入数据,但这会导致每个表都有一行,而且还有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
函数。
您可以尝试创建一个包含要抓取的所有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)
}
我们可以使用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]])