如何用dplyr在R中对齐按日期索引的股票数据?
股票数据按日期对齐(dplyr实现)
原始数据获取代码
._883<-quantmod::getSymbols("0883.HK",from="2022-04-21",to="2022-12-22",auto.assign = FALSE) ._600938<-quantmod::getSymbols("600938.SS",from="2022-04-21",to="2022-12-22",auto.assign = FALSE) ._883<-._883[,6] ._600938<-._600938[,6] spread<-data.frame(._883,._600938) > length(._883) [1] 169 > length(._600938) [1] 165
这段代码通过quantmod包获取了0883.HK和600938.SS两只股票2022年4月21日至12月22日的收盘价数据,其中._883有169条记录,._600938有165条记录,二者均以日期为索引。需求是用dplyr包找出._600938中的缺失数据,删除对应整行(包括._883的对应行)实现日期对齐。
dplyr实现方案
方法一:转换为数据框后连接过滤
先将两个时间序列转为带日期列的数据框,再通过连接和过滤实现对齐:
library(dplyr) library(tibble) # 转换._883为带日期列的tibble df_883 <- ._883 %>% as.data.frame() %>% rownames_to_column(var = "date") %>% rename(close_883 = ._883) %>% mutate(date = as.Date(date)) # 转换._600938为带日期列的tibble df_600938 <- ._600938 %>% as.data.frame() %>% rownames_to_column(var = "date") %>% rename(close_600938 = ._600938) %>% mutate(date = as.Date(date)) # 按日期左连接,过滤掉._600938收盘价缺失的行 aligned_data <- df_883 %>% left_join(df_600938, by = "date") %>% filter(!is.na(close_600938)) # 计算价差 aligned_data <- aligned_data %>% mutate(spread = close_600938 - close_883)
方法二:利用xts内连接快速对齐
直接对xts对象做内连接,只保留双方都存在的日期,再转换为数据框处理:
library(dplyr) library(xts) # 内连接合并两个xts对象,自动对齐日期 merged_data <- merge(._883, ._600938, join = "inner") %>% as.data.frame() %>% rownames_to_column("date") %>% mutate(date = as.Date(date)) %>% rename(close_883 = ._883, close_600938 = ._600938) %>% mutate(spread = close_600938 - close_883)
你尝试的替代方法问题分析
你写的代码:
x<-cbind(._883,._600938) na.omit(x) x$spread<-x[,2]-x[,1]
存在两个核心问题:
na.omit(x)的结果没有赋值回变量,后续计算价差还是用的原始带NA的数据集,等于白做了过滤。- 正确的写法应该是把过滤后的结果赋值给新变量,再基于它计算价差:
x <- cbind(._883, ._600938) x_clean <- na.omit(x) x_clean$spread <- x_clean[,2] - x_clean[,1]
这种方法本质是删除所有含NA的行,因为._883没有缺失值,所以效果和需求一致,但dplyr的写法更灵活,方便后续扩展数据处理逻辑。
内容的提问来源于stack exchange,提问作者Bubbles
相关产品推荐
相关产品推荐

