我有一系列日期:

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

我有一些与问题必然相关的辅助函数,我会尽量将它们排除在外。

我从第一个日期开始并调用此函数:
# 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])

现在我遍历其余的日期,为每个日期创建一个新的 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)
}

但是绑定(bind)没有发生,我留下了范围中第一个日期的原始数据框,在 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)

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

最佳答案

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

改变

rbind(atl_weather, get_table("ATL", d), d)

对此
atl_weather <- rbind(atl_weather, get_table("ATL", d), d)

假设 atl_weather 是您要增量添加的数据框。

也就是说,您不想在 R 中执行此操作;每次向对象添加列/行时,R 都需要进行大量数据复制。基本上,以这种方式递增增长的对象会产生很多开销,而这样做肯定会让您的代码陷入困境。

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

关于r - 为什么 rbind() 在 for 循环中不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46086322/

10-10 07:43