繁体   English   中英

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

[英]R append to data.frame during loop from list variables

我正在下载url列表,该列表成为列表。 为了运行列表,我使用了循环。 在循环期间,我使用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, ]

不用执行for循环,而是使用lapply生成data.frames列表。 然后,您可以在最后使用do.call rbind它们。 这是草图

dfs <- lapply(xls.src, function(src) {
    download.file(src, destfile="file.xls")
    read.xls("file.xls", header=TRUE)
})
final <- do.call(rbind, dfs)

此处dfs将是每次对read.xls调用生成的data.frames列表。 您可以添加所有数据清理,但这通常是更好的策略。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM