使用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
相关产品推荐
相关产品推荐

