嵌套循环出现subscript out of bounds error(下标越界错误)求助
问题修复:嵌套列表赋值的下标越界错误
错误原因
你遇到的下标越界错误,核心问题是**data_period_window初始化为空向量c(),而非嵌套列表结构**。当尝试给data_period_window[[j]][[i]]赋值时,data_period_window[[j]]根本不存在,R无法找到对应的列表层级,因此抛出错误。
另外原代码中创建数据框的matrix参数存在逻辑错误:n=10远小于nrow=100 * ncol=5=500的需求,R会重复循环这10个值,建议修正为n=100*5以生成符合维度的随机数据。
修复后的代码
set.seed(1) # 修正matrix的n参数,生成100行5列的随机数据 data1 <- as.data.frame(matrix(runif(n=100*5, min =-0.01, max=0.01), nrow =100, ncol =5)) data2 <- as.data.frame(matrix(runif(n=100*5, min =-0.01, max=0.01), nrow =100, ncol =5)) data3 <- as.data.frame(matrix(runif(n=100*5, min =-0.01, max=0.01), nrow =100, ncol =5)) data4 <- as.data.frame(matrix(runif(n=100*5, min =-0.01, max=0.01), nrow =100, ncol =5)) data5 <- as.data.frame(matrix(runif(n=100*5, min =-0.01, max=0.01), nrow =100, ncol =5)) rolling_window_set <- c(12,36,60) my_list <- list(data1,data2,data3,data4,data5) # 初始化嵌套列表:先创建对应窗口数量的外层列表,每个外层元素再初始化内层列表 data_period_window <- vector("list", length(rolling_window_set)) for(j in seq_along(rolling_window_set)) { data_period_window[[j]] <- vector("list", length(my_list)) for (i in seq_along(my_list)) { # 截取对应窗口大小的最后N行数据 window_size <- rolling_window_set[[j]] data_period_window[[j]][[i]] <- my_list[[i]][(nrow(my_list[[i]]) - window_size + 1):nrow(my_list[[i]]), ] } }
关键修复点
- 正确初始化嵌套列表:先用
vector("list", length(...))创建外层列表,再为每个外层元素创建内层列表,确保赋值时层级存在。 - 使用
seq_along()替代1:length():这是更安全的遍历方式,避免当列表为空时出现错误。 - 修正随机数据生成逻辑:确保
matrix的元素数量匹配行和列的乘积。
结果验证
修复后的数据结构完全符合你的需求:
data_period_window[[1]]包含5个数据框,每个数据框为原数据的最后12行(nrow=12,ncol=5)data_period_window[[2]]包含5个数据框,每个数据框为原数据的最后36行data_period_window[[3]]包含5个数据框,每个数据框为原数据的最后60行
注:你描述中提到“第1层的每个输出数据框ncol=12”,但原数据都是5列,推测是混淆了行和列,上述代码实现的是对应窗口大小的行数截取,若确实需要修改列数,请补充说明需求。
内容的提问来源于stack exchange,提问作者Jak Carty
相关产品推荐
相关产品推荐

