我正在下载成为列表的网址列表。要运行列表,我使用循环。在循环中我使用cbind将结果附加到data.frame。我疯狂的工作方式似乎不是最好的方式。我想知道还有什么方法可以实现这一目标。为了使rbind工作,我必须获取文件结构的副本并将其用作空白模板。必须有更多的R方法来执行此操作,因此在运行循环之前,我运行一次以获取结构:
final <- final[1,]
library(stringr)
library(gdata)
library(XML)
# get the files for department of revenue OFM
url = "http://dor.wa.gov/Content/AboutUs/StatisticsAndReports/stats_taxretail.aspx"
# use xml to get the names of the files that are xls and xlsx that have data
links = htmlParse(url)
src = xpathApply(links, "//a[@href]", xmlGetAttr, "href")
xls.src = src[grep(".xls", src, fixed=T)]
# xls.src = xls.src[1:3] # testing size
base = "http://dor.wa.gov"
for (i in seq(xls.src)){
url = paste0(base, xls.src[[i]])
download.file(url, destfile="file.xls")
retail <- read.xls("file.xls", header=TRUE)
names(retail) <- tolower(names(retail))
retail <- retail[complete.cases(retail$location),c(1,2, 5, 6)]
retail$year <- paste0(unlist(str_extract_all(url, "\\(?[0-9]")), collapse="")
names(retail)[3:4] <- c("firms", "taxable sales")
final = rbind(final, retail) # final starts here with 1 row of dummy data
}
# this removes the first
wa.retail <- final[-1, ]
答案 0 :(得分:1)
使用for
生成lapply
列表,而不是进行data.frames
循环。然后,您可以使用rbind
do.call
将它们全部dfs <- lapply(xls.src, function(src) {
download.file(src, destfile="file.xls")
read.xls("file.xls", header=TRUE)
})
final <- do.call(rbind, dfs)
。这是草图
dfs
此处data.frames
将是每次调用read.xls
时生成的{{1}}列表。您可以在所有数据清理中添加回来,但这通常是一种更好的策略。