如何在R的for循环中追加数据框并合并为单个数据框?
问题分析与解决方案
错误原因
- 列表下标类型错误:你用
liist[[iso]] <- iso尝试将sf数据框iso作为列表下标,R不允许用列表/数据框类型作为列表元素的下标,必须使用整数、字符这类合法下标。 - 循环逻辑错误:嵌套循环
for(i in df$h3_longitude)+for(j in df$h3_latitude)会把所有经度和纬度两两组合计算,而非对应每行的经纬度对,这会产生大量冗余计算,不符合需求。 - 合并时机错误:在循环内部反复调用
bind_rows效率极低,应等所有数据框存入列表后再一次性合并。
修正后的代码
方法1:修正for循环写法
library(dplyr) library(sf) library(osrm) # 读取数据 df <- read.csv('csv path') # 初始化空列表 iso_list <- list() # 遍历每行的经纬度对(用行索引循环) for (row_idx in seq_len(nrow(df))) { # 获取当前行的经纬度 lon <- df$h3_longitude[row_idx] lat <- df$h3_latitude[row_idx] # 生成等时线 iso <- osrmIsochrone(loc = c(lon, lat), breaks = seq(0,90,30), osrm.profile='car') # 向列表追加元素(用长度+1作为下标,保证每次加在末尾) iso_list[[length(iso_list) + 1]] <- iso } # 循环结束后一次性合并所有数据框 combined_df <- bind_rows(iso_list)
方法2:用lapply替代for循环(更符合R风格)
如果熟悉函数式编程,lapply可以更简洁地完成任务,避免手动管理列表下标:
library(dplyr) library(sf) library(osrm) df <- read.csv('csv path') # 用lapply遍历每行,生成等时线列表 iso_list <- lapply(seq_len(nrow(df)), function(row_idx) { lon <- df$h3_longitude[row_idx] lat <- df$h3_latitude[row_idx] osrmIsochrone(loc = c(lon, lat), breaks = seq(0,90,30), osrm.profile='car') }) # 合并列表 combined_df <- bind_rows(iso_list)
额外提示
osrmIsochrone返回的是sf对象,bind_rows可正常合并sf数据框,若后续处理空间数据,需保持sf格式。- 若数据量较大,可使用
pbapply包的pblapply添加进度提示,方便查看循环进度。
内容的提问来源于stack exchange,提问作者data en
相关产品推荐
相关产品推荐

