如何在R语言循环中动态命名对象并实现rbind合并?
解决循环中滚动周期求和结果被覆盖的方案
你的核心问题是:循环中每次用assign生成同名对象,导致之前的结果被覆盖。以下是两种直接有效的解决方法:
方法1:循环内直接追加数据框
先初始化一个空数据框,每次计算完当前滚动周期的结果后,用rbind追加到目标数据框,避免覆盖:
# 初始化空数据框存储所有滚动周期结果 tab_70 <- data.frame() for(j in 1900:1910){ # 计算当前滚动周期的求和数据 temp_df <- florida_annual[florida_annual$year >= j & florida_annual$year <= j + 70,] %>% group_by(geoid) %>% summarise(cat_total = sum(disaster1), .groups = 'drop') %>% mutate(year_group = paste0(j,"_", j+70)) # 追加到目标数据框 tab_70 <- rbind(tab_70, temp_df) }
方法2:列表收集后一次性合并(推荐)
用列表存储每个周期的结果,最后用dplyr::bind_rows合并,比循环内多次rbind效率更高,代码更清晰:
# 初始化列表存储各周期结果 result_list <- list() for(j in 1900:1910){ result_list[[as.character(j)]] <- florida_annual[florida_annual$year >= j & florida_annual$year <= j + 70,] %>% group_by(geoid) %>% summarise(cat_total = sum(disaster1), .groups = 'drop') %>% mutate(year_group = paste0(j,"_", j+70)) } # 合并所有周期结果为一个数据框 tab_70 <- bind_rows(result_list)
扩展:多滚动窗口长度的处理
如果需要循环多种滚动窗口长度(比如不止70年),可以嵌套列表存储结果:
all_results <- list() # 循环不同的滚动窗口长度 for(x in c(70, 80)){ window_list <- list() for(j in 1900:1910){ window_list[[as.character(j)]] <- florida_annual[florida_annual$year >= j & florida_annual$year <= j + x,] %>% group_by(geoid) %>% summarise(cat_total = sum(disaster1), .groups = 'drop') %>% mutate(year_group = paste0(j,"_", j+x), window_length = x) } all_results[[paste0("tab_", x)]] <- bind_rows(window_list) } # 提取单个窗口结果 tab_70 <- all_results[["tab_70"]] # 合并所有窗口结果 all_combined <- bind_rows(all_results)
内容的提问来源于stack exchange,提问作者tchoup
相关产品推荐
相关产品推荐

