为什么rbind()不在for循环中工作?

Con*_* M. 2 loops r rbind

我有一系列日期:

date_rng <- seq( as.Date("2008-01-01"), as.Date("2008-12-31"), by="+1 day")
Run Code Online (Sandbox Code Playgroud)

我有一些辅助功能,这些功能必然与问题相关,我会尝试将它们排除在外.

我从第一个日期开始并调用此函数:

# Function for getting weather table by airport code and date and return dataframe
get_table <- function(code, date){
  adv <- sprintf(
    "https://www.wunderground.com/history/airport/K%s/2008/%s/%s/DailyHistory.html", 
    code, month(date), day(date)
  )
  h <- adv %>% read_html()
  t <- h%>% 
  html_nodes(xpath = '//*[@id="obsTable"]') %>%
  html_table()
  df <- data.frame(t)
  return(df)
}
atl_weather <- get_table("ATL", date_rng[1])
Run Code Online (Sandbox Code Playgroud)

现在我迭代剩下的日期为每个日期创建一个新的df然后我尝试附加到原始日期:

# Loop through remaining dates and bind dfs
for(d in as.list(date_rng[2:4])){
  rbind(atl_weather, get_table("ATL", d), d)
}
Run Code Online (Sandbox Code Playgroud)

但绑定不会发生,我留下了在for循环之前创建的范围中第一个日期的原始数据帧.

这有效:

atl_weather <- get_table("ATL", date_rng[1])
new_df <- get_table("ATL", date_rng[2])
new_df <- scraped_data_formatter(new_df, date_rng[2])
rbind(atl_weather, new_df)
Run Code Online (Sandbox Code Playgroud)

如何让rbind()在for循环中工作(这样我就可以迭代地构建数据帧以包含完整日期范围内的所有数据)?

Rei*_*son 5

它确实有效.问题是你丢弃了结果,因为你没有将输出分配rbind()给任何东西.

更改

rbind(atl_weather, get_table("ATL", d), d)
Run Code Online (Sandbox Code Playgroud)

对此

atl_weather <- rbind(atl_weather, get_table("ATL", d), d)
Run Code Online (Sandbox Code Playgroud)

假设atl_weather是您要逐步添加的数据框.

这就是说,你希望这样做R中 ; 每次向对象添加列/行时,R都需要进行大量的数据复制.基本上,以这种方式增量增长对象会产生很多开销,这样做是一种让你的代码陷入困境的可靠方法.

理想情况下,您首先要分配足够的空间(即足够的行,以便您可以i在分配时为第一行编制索引:new_atl_weather[i, ] <- c(....).)