如何通过字符向量批量引用R中生成的xts对象并合并?
解决批量合并quantmod获取的xts对象问题
我来帮你搞定这个批量引用并合并xts对象的问题!其实核心是用对工具——mget()函数专门用来批量获取对应名称的对象,配合do.call(merge, ...)就能轻松合并。
方案一:基于你已生成的全局xts对象合并
你已经通过循环把5个xts对象放到了全局环境里,现在只需要两步就能合并:
# 1. 批量获取全局环境中与Tickers同名的xts对象,生成一个列表 xts_objects <- mget(Tickers) # 2. 合并列表中的所有xts对象 merged_xts <- do.call(merge, xts_objects) # 可选:给合并后的列设置明确的名称,方便后续分析 colnames(merged_xts) <- Tickers
为什么你之前的方法没成功?
eval(parse(text = Tickers)):这个写法会依次执行每个ticker字符串,但只会返回最后一个执行的结果(也就是CM对应的对象),不会把所有对象收集起来。- 单独用
get():一次只能获取一个对象,你需要用lapply(Tickers, get)来批量生成列表再合并,不过mget()比这个更直接简洁。
方案二:优化数据获取流程,避免生成零散的全局对象
其实你可以跳过循环和assign,直接在获取数据时就生成列表,这样代码更整洁,也不会在全局环境里留下一堆单独的xts对象:
library(quantmod) Tickers <- c("RY", "TD", "BNS", "BMO", "CM") StartDate <- as.Date("2001-01-01") EndDate <- Sys.Date() # 批量获取每个ticker的调整后收盘价(对应你之前取的第6列),生成列表 xts_list <- lapply(Tickers, function(ticker) { # auto.assign=FALSE避免自动生成全局对象,直接返回xts对象 getSymbols(ticker, from = StartDate, to = EndDate, auto.assign = FALSE)[, "Adjusted"] }) # 给列表元素命名,方便合并后识别列 names(xts_list) <- Tickers # 合并列表中的xts对象 merged_xts <- do.call(merge, xts_list)
关键函数解释
mget(x):接收字符向量x,从当前环境中取出所有名称匹配的对象,返回一个以x元素为名称的列表。do.call(func, list):把函数func应用到列表list的所有元素上,相当于手动调用merge(RY, TD, BNS, BMO, CM),但批量操作更高效。
这样处理后,你就得到了一个包含所有股票数据的合并xts对象,直接用于后续分析就可以啦!
内容的提问来源于stack exchange,提问作者Conjonorama
相关产品推荐
相关产品推荐

