R在列表变量循环期间附加到data.frame

时间:2014-05-22 21:21:45

标签: r

我正在下载成为列表的网址列表。要运行列表,我使用循环。在循环中我使用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, ]

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}}列表。您可以在所有数据清理中添加回来,但这通常是一种更好的策略。