我有一系列日期:
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/