R语言中如何用for循环对列表内数据框批量应用函数添加滞后领先指标
核心原因
R 语言中 for 循环遍历列表时,取出的循环变量是原数据框的临时副本,对副本的修改不会同步到列表内的原始对象,也不会更新全局环境中的 df1/df2/df3/df4 变量。
修正方案
推荐优先使用索引遍历列表的方案,后续批量处理数据更便捷:
# 需提前加载dplyr包,lag/lead为dplyr内置函数 library(dplyr) dataframes = list(df1,df2,df3,df4) # 按索引遍历修改列表内的元素 for (i in seq_along(dataframes)){ dataframes[[i]][paste0("lag", 1:12)] = lapply(1:12, lag, x=dataframes[[i]][,2]) dataframes[[i]][paste0("lead", 1:12)] = lapply(1:12, lead, x=dataframes[[i]][,2]) } # 可选:如果需要将处理后的数据同步回全局环境的df1~df4变量,添加以下代码 names(dataframes) = c("df1", "df2", "df3", "df4") list2env(dataframes, envir = .GlobalEnv)
如果不需要维护数据框列表,只想直接修改全局的4个数据框,可以使用变量名遍历方案:
library(dplyr) df_names = c("df1", "df2", "df3", "df4") for (name in df_names) { df = get(name) df[paste0("lag", 1:12)] = lapply(1:12, lag, x=df[,2]) df[paste0("lead", 1:12)] = lapply(1:12, lead, x=df[,2]) assign(name, df) }
注意:如果未加载dplyr包,会调用R基础包的lag函数,输出结果不符合预期,运行前请确认包已加载。
内容的提问来源于stack exchange,提问作者Carlos Aguilar
相关产品推荐
相关产品推荐

