for循环处理多个data.frame时无法更新原对象问题求助
问题分析与解决方案
错误原因
你的循环操作的是mget返回列表中每个data.frame的临时副本,修改val只是改变这个副本,不会同步到全局环境中的原对象(比如loans93、loans94等),所以循环结束后原data.frame完全没变化,只有临时变量val被反复覆盖。
解决方案
方案1:修正for循环(直接操作全局环境对象)
保留原对象的名称向量,通过名称获取并修改全局环境中的data.frame:
# 定义需要处理的data.frame名称 df_names <- c("loans93","loans94","loans95","loans96","loans97","loans98") # 循环遍历名称,处理后存回原对象 for (name in df_names) { assign( x = name, value = get(name) %>% select(account_id, district_id, balance, status, date) %>% group_by(account_id, district_id, status, date) %>% summarise(balance = mean(balance, na.rm = TRUE)) %>% ungroup(), envir = .GlobalEnv ) }
get(name):从全局环境中取出对应名称的data.frameassign(name, ...):将处理后的结果重新赋值给全局环境中的原名称对象
方案2:用lapply批量处理(更符合tidyverse风格)
用lapply批量处理所有data.frame,再通过list2env将结果存回全局环境:
df_names <- c("loans93","loans94","loans95","loans96","loans97","loans98") # 批量处理所有data.frame processed_dfs <- lapply(mget(df_names), function(df) { df %>% select(account_id, district_id, balance, status, date) %>% group_by(account_id, district_id, status, date) %>% summarise(balance = mean(balance, na.rm = TRUE)) %>% ungroup() }) # 将处理后的列表元素存回全局环境,覆盖原对象 list2env(processed_dfs, envir = .GlobalEnv)
lapply(mget(df_names), ...):遍历所有目标data.frame,执行处理逻辑,返回包含处理后结果的列表list2env(...):把列表中的每个元素以其名称为变量名,赋值到全局环境中
内容的提问来源于stack exchange,提问作者iago nunes
相关产品推荐
相关产品推荐

