R语言循环拆分时间序列遇报错,仅生成单个序列求助
解决时间序列拆分问题:从1个到55个序列的修复方案
先搞定那个警告信息
In 1:5:length(N) : 数值表达式包含5个元素:仅首个元素被使用
这个警告是因为你写了1:5:length(N)这种错误语法——R会把它解析成(1:5):length(N),而1:5是包含5个元素的向量,R只会取它的第一个元素(也就是1)来生成序列,相当于实际执行了1:length(N)。如果你的本意是遍历N的所有元素,直接用1:length(N)或者更安全的seq_along(N)就好,后者在N为空时也不会出错。
为什么你只得到1个时间序列?
你的嵌套循环里每次都把结果赋值给my_ts,这意味着每一轮循环都会覆盖之前的结果,最后自然只剩下最后一组(D[i], N[j])对应的时间序列。要保留所有55个序列,你需要把每个结果存储到一个列表里,而不是单个变量。
修改后的代码方案
# 先获取唯一的层级 D <- unique(T$daypart) N <- unique(T$network) # 创建一个空列表来存储所有时间序列 my_ts_list <- list() # 嵌套循环遍历所有组合 for (i in seq_along(D)) { for(j in seq_along(N)) { # 给每个序列生成一个有意义的名字,方便后续查找 ts_name <- paste(D[i], N[j], sep = "_") # 过滤数据并存入列表 my_ts_list[[ts_name]] <- filter(T, network == N[j], daypart == D[i]) } } # 查看结果:列表里应该有55个元素 length(my_ts_list) # 可以通过名字调用特定序列,比如 my_ts_list[["morning_networkA"]]
更简洁的替代方案(无需嵌套循环)
如果你熟悉tidyverse工具包,用nest()能更优雅地完成拆分,代码更简洁可读性也更高:
library(tidyverse) # 按daypart和network分组,嵌套每个组的数据 ts_nested <- T %>% group_by(daypart, network) %>% nest() %>% mutate(ts = map(data, ~ as.ts(.x))) # 按需转换成时间序列格式 # 提取所有时间序列到列表 my_ts_list <- ts_nested$ts # 对应的分组信息可以从ts_nested的daypart和network列获取
这样你就能轻松得到55个独立的时间序列,每个都对应daypart和network的一个组合啦。
内容的提问来源于stack exchange,提问作者Ziang Xu
相关产品推荐
相关产品推荐

