将dplyr的group_by、mutate应用于xts时间序列失败,求解决方法
解决xts/zoo对象无法使用dplyr group_by/mutate的问题
报错的核心原因是xts/zoo对象不属于tidyverse兼容的数据结构,dplyr的group_by、mutate等函数没有针对这类时间序列对象的实现,因此直接对xts对象调用这些函数会触发方法不匹配错误。
以下是两种可行的解决办法:
方案一:先在数据框层面完成分组计算,再转xts
原始的ttrc_total是标准数据框,先利用dplyr完成分组计算,再转换为xts对象,避免类型冲突:
library(TTR) library(tidyverse) library(xts) data(ttrc) ttrc_total <- rbind(ttrc %>% mutate(category='A'), ttrc %>% mutate(category='B'), ttrc %>% mutate(category='C')) # 1. 数据框分组计算ATR(ATR返回列表,需提取`atr`列) ttrc_processed <- ttrc_total %>% group_by(category) %>% mutate(ATR_10 = ATR(select(., High, Low, Close), n=10)$atr) %>% ungroup() # 2. 转换为xts对象,用Date列作为时间索引 ttrc_xts <- xts(ttrc_processed %>% select(-Date), order.by = ttrc_processed$Date)
方案二:基于xts对象直接分组处理
如果需要保留xts对象的操作流程,可以通过split拆分分组、lapply批量计算后再合并:
library(TTR) library(tidyverse) library(xts) data(ttrc) ttrc_total <- rbind(ttrc %>% mutate(category='A'), ttrc %>% mutate(category='B'), ttrc %>% mutate(category='C')) # 1. 先转换为xts对象 ttrc_xts <- xts(ttrc_total %>% select(-Date), order.by = ttrc_total$Date) # 2. 按category拆分xts为列表,逐个计算ATR xts_grouped <- split(ttrc_xts, f = ttrc_xts$category) ttrc_xts_with_atr <- lapply(xts_grouped, function(group) { group$ATR_10 <- ATR(group[, c("High", "Low", "Close")], n=10)$atr group }) %>% do.call(rbind, .)
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

