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

如何在R中填充包含不同长度向量的矩阵?

问题:用不同长度向量填充矩阵时出现长度不匹配错误

我尝试用不同长度的向量填充矩阵,生成多个数据子集用于时间序列预测模型的重训练流程,但运行R代码时出现错误:number of items to replace is not a multiple of replacement length。我原本期望用NA补全长度不等于最长向量的短向量,请问如何正确实现?

原代码

ST_Nile <- Nile
n <- length(ST_Nile)
k <- 5
qty_modelos <- 6
m <- c(rep(NA,qty_modelos))
t <- c(rep(NA,qty_modelos))
TrainNile <- c(rep(NA,95))
Matriz_train <- matrix(ncol = 95, nrow = qty_modelos, byrow = TRUE)

for (i in 1:qty_modelos) {
  if (i==1) {
    m[i] <- 30
  } else { m[i] <- m[i-1] - k}
  t[i] <- n - m[i]
  TrainNile[i] <- ST_Nile[1:t[i]]
  if (length(TrainNile[i])==95) {
    Matriz_train <- append(Matriz_train[i,],TrainNile[i])
  } else{
    TrainNile[i] = c(TrainNile[i], rep(NA, 95 - length(TrainNile[i])))
    Matriz_train <- append(Matriz_train[i,],TrainNile[i])
  }
}

数据dput输出

structure(c(1120, 1160, 963, 1210, 1160, 1160, 813, 1230, 1370, 1140, 995, 935, 1110, 994, 1020, 960, 1180, 799, 958, 1140, 1100, 1210, 1150, 1250, 1260, 1220, 1030, 1100, 774, 840, 874, 694, 940, 833, 701, 916, 692, 1020, 1050, 969, 831, 726, 456, 824, 702, 1120, 1100, 832, 764, 821, 768, 845, 864, 862, 698, 845, 744, 796, 1040, 759, 781, 865, 845, 944, 984, 897, 822, 1010, 771, 676, 649, 846, 812, 742, 801, 1040, 860, 874, 848, 890, 744, 749, 838, 1050, 918, 986, 797, 923, 975, 815, 1020, 906, 901, 1170, 912, 746, 919, 718, 714, 740), .Tsp = c(1871, 1970, 1), class = "ts")

错误原因分析

  1. 单个元素赋值错误:TrainNile[i] <- ST_Nile[1:t[i]]试图把长度为t[i]的向量赋值给TrainNile的第i个元素,会自动截断向量到单个值,导致后续长度判断完全失效。
  2. 矩阵修改方式错误:使用append修改矩阵行是错误的,append返回的是向量而非矩阵,会破坏原矩阵的二维结构,触发维度不匹配错误。

修正方案

直接在循环中生成补全NA的完整向量,赋值给矩阵对应行即可,无需多余的中间变量操作。

修正后的代码

ST_Nile <- Nile
n <- length(ST_Nile)
k <- 5
qty_modelos <- 6
max_len <- 95  # 明确最长向量长度,提升可读性

# 初始化目标矩阵
Matriz_train <- matrix(NA, nrow = qty_modelos, ncol = max_len)

for (i in 1:qty_modelos) {
  # 计算当前训练集的长度
  m_i <- if (i == 1) 30 else 30 - k*(i-1)
  t_i <- n - m_i
  
  # 提取子集并补NA到指定长度
  train_subset <- ST_Nile[1:t_i]
  train_subset_padded <- c(train_subset, rep(NA, max_len - length(train_subset)))
  
  # 直接赋值给矩阵第i行
  Matriz_train[i, ] <- train_subset_padded
}

# 验证结果(可选)
head(Matriz_train)

关键修改点

  • 移除冗余的m、t、TrainNile变量,直接在循环内计算参数,简化代码。
  • 明确声明max_len,让代码逻辑更清晰。
  • 直接生成补全NA的子集并赋值给矩阵行,避免维度混乱。
  • 去掉错误的append操作,保持矩阵的二维结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:19:58