R Studio批量获取股票数据时,如何跳过无起始日期数据的标的?
解决R中获取股票数据时行数不匹配的问题
首先,咱们来拆解一下你遇到的问题:报错arguments imply differing number of rows: 44, 38是因为AKOb的交易数据行数和其他标的不一致——它在你设定的日期区间内缺少部分交易日的数据,直接cbind行数不同的数据框自然会报错。手动排查确实效率太低,下面给你一套自动过滤无效标的的方案,一步解决问题:
步骤1:加载所需包(新增purrr简化列表处理)
library(quantmod) library(timetk) library(dplyr) library(tibble) library(tidyr) library(purrr)
步骤2:定义参数和数据获取函数
我们先写一个封装好的函数,用来获取单个标的的数据,同时自动检查数据有效性:
mdate <- "2015-10-30" edate <- "2016-01-05" tickers <- c("ABG","ACH","ADM","AEG","AEM","AGQ","AGRO","AKOb","APO") # 自定义函数:获取单只股票数据并做有效性检查 get_valid_ticker_data <- function(ticker) { tryCatch({ # 获取数据 ticker_data <- getSymbols(ticker, from = mdate, to = edate, auto.assign = FALSE) # 检查1:该区间内是否有数据 if (nrow(ticker_data) == 0) { warning(paste("自动跳过", ticker, ":指定日期区间内无数据")) return(NULL) } # 检查2(可选):是否覆盖区间内所有交易日(按需开启) # 获取区间内所有交易日 all_trading_days <- seq.Date(as.Date(mdate), as.Date(edate), by = "day") %>% filter(weekdays(.) %in% c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")) if (nrow(ticker_data) != length(all_trading_days)) { warning(paste("自动跳过", ticker, ":指定日期区间内存在缺失交易日")) return(NULL) } # 给列名添加ticker前缀,避免合并时列名冲突 colnames(ticker_data) <- paste(ticker, colnames(ticker_data), sep = ".") return(ticker_data) }, error = function(e) { # 捕获获取数据时的错误(比如ticker拼写错误) warning(paste("自动跳过", ticker, ":获取数据出错,错误信息:", e$message)) return(NULL) }) }
步骤3:批量获取并过滤有效数据
用purrr::map批量处理所有标的,自动过滤掉无效数据:
# 获取所有有效标的的数据列表 valid_data_list <- map(tickers, get_valid_ticker_data) %>% discard(is.null) # 移除返回NULL的无效标的 # 合并有效数据 data <- do.call(cbind, valid_data_list)
步骤4:继续你的转置和重塑操作
现在data里只有符合条件的标的数据,行数完全一致,后续操作就不会报错了:
# 转置数据框 td_data <- within(data.frame(price_var = row.names(t(data)), t(data), row.names = NULL), { ticker_cd <- as.factor(gsub("[.].*", "", price_var)) price_var <- as.factor(gsub(".*[.]", "", price_var)) } ) # 重塑数据 abc <- do.call("cbind", split(td_data, td_data$price_var))
关键说明:
tryCatch用来捕获获取数据时的异常(比如ticker拼写错误、网络问题),避免整个流程中断;- 双重检查可以灵活控制:如果你只需要区间内有数据即可,不需要覆盖所有交易日,可以把第二个检查注释掉;
- 自动过滤无效标的后,合并的数据框行数完全一致,彻底解决
cbind时的行数不匹配问题。
内容的提问来源于stack exchange,提问作者Dongchul Park
相关产品推荐
相关产品推荐

