我有一系列日期:
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循环中工作(这样我就可以迭代地构建数据帧以包含完整日期范围内的所有数据)?
它确实有效.问题是你丢弃了结果,因为你没有将输出分配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(....).)
| 归档时间: |
|
| 查看次数: |
1466 次 |
| 最近记录: |