R语言for循环中如何动态引用data frame并完成rbind合并?
R循环批量处理数据框的实现方案
你代码的问题所在
你最初的写法没有生效,是因为R的变量名是静态解析的:代码里写的ti、wi就是固定叫ti、wi的对象,不会自动把循环变量i的值代入到名称里生成t1/t2这类对象,每次循环都会直接覆盖上一轮的结果。
你后续用assign的写法虽然可以动态生成全局对象,但把大量同结构的零散数据框放在全局环境属于R的反面实践,后续索引、合并、修改都非常麻烦,完全没有必要这么做。
推荐实现方案
优先用列表存储批量生成的同结构数据框,后续不管是取单个对象还是合并都非常方便:
# 初始化空列表存储三类结果 t_list <- list() w_list <- list() m_list <- list() for(i in 1:16) { t_list[[i]] <- tail(subset(sc2, week3 < i), n = 200) w_list[[i]] <- subset(sc2, week3 == i) m_list[[i]] <- rbind(t_list[[i]], w_list[[i]]) }
后续操作说明
- 要取单个迭代的结果,直接用列表索引即可:比如
t1对应t_list[[1]],w3对应w_list[[3]] - 要把所有
mi合并成一个总数据框,直接调用do.call即可:
如果安装了total_df <- do.call(rbind, m_list)dplyr包,也可以用更稳定的bind_rows:library(dplyr) total_df <- bind_rows(m_list)
特殊场景补充:如果你必须保留全局的trst1/w1等对象
如果有特殊需求必须把生成的数据框放到全局环境,后续合并可以用get函数动态引用对象:
total_df <- data.frame() for(i in 1:16) { ti <- get(paste0("trst", i)) wi <- get(paste0("w", i)) total_df <- rbind(total_df, ti, wi) }
更简洁的tidyverse写法
如果你习惯用tidyverse生态,可以完全不用显式写循环,一行代码就能得到最终合并结果:
library(purrr) library(dplyr) total_df <- map_dfr(1:16, ~bind_rows( sc2 %>% filter(week3 < .x) %>% tail(200), sc2 %>% filter(week3 == .x) ))
内容的提问来源于stack exchange,提问作者Ted Regents
相关产品推荐
相关产品推荐

