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

使用dtwclust进行时间序列聚类:dplyr数据框转序列列表报错求助

解决dtwclust时间序列聚类的数据格式问题

问题根源

你的代码报错是因为传给tsclust的是数据框,而不是它要求的时间序列列表。all.B2_MAX.tsc[-1]是包含两列的dplyr数据框,tsclust无法直接处理这种结构,必须传入由每个STAND对应时间序列组成的列表。

修正后的完整代码

library(dplyr)
library(purrr)
library(dtwclust)

# 读取数据
all.B2_MAX.stands <- read.csv("https://raw.githubusercontent.com/Leprechault/trash/main/my_ts_data.csv")

# 整理为符合要求的时间序列列表:每个元素对应一个STAND的ts对象
all_ts_list <- all.B2_MAX.stands %>%
  group_by(STAND) %>%
  # 分组内按DATE_TIME排序,保证时序正确
  arrange(DATE_TIME, .by_group = TRUE) %>%
  # 生成每个分组的ts对象并存储为列表列
  summarise(ts_obj = list(ts(B2_MAX))) %>%
  # 提取ts对象列表,作为tsclust的输入
  pull(ts_obj)

# 执行DTW聚类
clusters <- tsclust(all_ts_list, 
                    type = "partitional", 
                    k = 2L, 
                    distance = "dtw",
                    centroid = "pam")

# 绘制聚类结果(注意变量名是clusters,原代码写错为cluster)
plot(clusters, type = "sc")

关键修正点

  • 用arrange在分组内按DATE_TIME排序,替代原代码中B2_MAX[order(DATE_TIME)]的写法,逻辑更清晰
  • 通过pull(ts_obj)直接提取时间序列列表,这是tsclust唯一接受的输入格式
  • 修正绘图时的变量名错误(原代码写的plot(cluster,...),实际变量是clusters)

简化写法(可选)

如果不需要保留原始分组数据框,也可以用nest简化步骤:

all_ts_list <- all.B2_MAX.stands %>%
  arrange(DATE_TIME) %>%
  group_by(STAND) %>%
  nest() %>%
  mutate(ts_obj = map(data, ~ts(.x$B2_MAX))) %>%
  pull(ts_obj)

内容的提问来源于stack exchange,提问作者Leprechault

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:14:56