R Programming ... For循环写入数据帧

时间:2016-04-18 23:41:15

标签: r

我正在尝试从互联网上下载一些数据,并且多年来在多个表格中都有数据...我可以建立连接并每年下载各种表格但是在运行脚本时它是手动的每年。

我已经设置了一个for循环来迭代这些年并将其写入数据帧,但是,每次循环它都会覆盖旧数据。

我尝试使用paste()设置一个变量,但是它不起作用,我想知道是否有解决方案我正在问。

以下是我正在使用的代码......

for(year in 2000:2010)
{
    url_team <- "x"
    team <- 'x'
    url <- paste(
        "http://www.ab.com/team/",url_team,"/",year,".htm", sep="")  
    table <- readHTMLTable(url, stringsAsFactors = FALSE)
}

3 个答案:

答案 0 :(得分:2)

考虑使用lapply()来获取html表中的数据帧列表。然后运行do.call(rbind, ...)将所有数据帧绑定到一个主数据框中:

dflist <- lapply(2000:2010, function(year){
                url_team <- "x"
                team <- 'x'
                url <- paste0("http://www.ab.com/team/",url_team,"/",year,".htm")  
                readHTMLTable(url, stringsAsFactors = FALSE)
          })

finaldf <- do.call(rbind, dflist)

答案 1 :(得分:1)

执行此操作的一种方法是将assign函数与paste函数一起使用。这看起来像这样:

for (year in 2000:2010) {
  url_team <- "x"
  team <- 'x'
  # paste0 automatically sets the sep argument to ""
  url <- paste0("http://www.ab.com/team/", url_team, "/", year, ".htm")  
  assign(paste0("table_", year), readHTMLTable(url, stringsAsFactors=F))
}

assign将根据您传递的名称创建新变量。缺点是你现在在你的工作区中有11个变量,这只会使一切变得混乱。相反,您应该只使用列表对象将其保存在一个位置。这看起来像这样:

tables = vector(mode="list", length=11)
for (i in 1:11) {
  year <- 1999 + i
  url_team <- "x"
  team <- 'x'
  url <- paste0("http://www.ab.com/team/", url_team, "/", year, ".htm")  
  tables[[i]] <- readHTMLTable(url, stringsAsFactors=F)
}
names(tables) <- as.character(2000:2010)

现在,您可以使用tables$2000tables$2003等来调用每个表格。最后你有11个表,但只有一个变量。

答案 2 :(得分:0)

试试这个:

library(dplyr)

data_frame(url_team = "x",
           team = "x",
           year = 2000:2010) %>%
  mutate(url = paste0("http://www.ab.com/team/",
                     url_team,"/",year,".htm") ) %>%
  group_by(year, team) %>%
  do(readHTMLTable(.$url, stringsAsFactors = FALSE) )

此外,如果您有多个团队:

team = data_frame(team = c("x", "y"),
                  url_team =  c("x", "y") )
year = data_frame(year = 2000:2010)

merge(year, team) %>%
  mutate(url = paste("http://www.ab.com/team/",
                     url_team,"/",year,".htm", sep="") ) %>%
  group_by(year, team) %>%
  do(readHTMLTable(.$url, stringsAsFactors = FALSE) )