如何通过循环将数据框指定观测列合并至主数据框?
问题根源
你代码里的核心问题是:循环中fin = tolower(unlist(vari))得到的是字符串形式的变量名(比如"indpro"),而非你通过assign创建的实际数据框对象。直接cbind(masterlist, fin)相当于把这个字符串重复成一列添加,自然无法得到目标观测列。
解决方案
方案1:修改现有循环,提取目标列
利用get()函数根据字符串变量名获取对应的数据框对象,再提取其中的观测列(跳过已有的date列):
# 不含GDP的变量列表 vari_list2 <- c("INDPRO","PI","SAVINGSL", "UNEMPLOY","HOUST") # 按日期合并数据框观测列的循环 for(vari in vari_list2){ var_name <- tolower(vari) # 获取对应数据框,提取目标观测列(drop=FALSE确保返回数据框而非向量) target_col <- get(var_name)[, var_name, drop = FALSE] masterlist <- cbind(masterlist, target_col) }
方案2:用列表存储数据,批量合并(推荐)
避免使用assign创建大量全局变量,改用列表统一存储数据,再通过reduce一次性合并,更符合tidyverse风格且更安全:
library(alfred) library(dplyr) library(tidyverse) # 变量列表 vari_list <- c("GDP","INDPRO","PI","SAVINGSL", "UNEMPLOY","HOUST") # 批量获取并格式化数据,存入列表 data_list <- map(vari_list, function(vari) { temp1 <- get_fred_series(vari, "value") data.frame(date = seq(as.Date("1776-07-04"), as.Date("2022-09-16"), 1)) %>% left_join(temp1) %>% fill("value") %>% rename(!!tolower(vari) := value) # 直接重命名列,更简洁 }) # 给列表命名,方便后续操作 names(data_list) <- tolower(vari_list) # 按date列合并所有数据框,自动去重date列 masterlist <- reduce(data_list, left_join, by = "date")
内容的提问来源于stack exchange,提问作者gillyp
相关产品推荐
相关产品推荐

