You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:52:44