如何将循环变成基于向量的代码?

时间:2019-04-09 08:57:51

标签: r loops dataframe vectorization

我需要将数据帧分成N个部分,这些部分应具有给定的长度(“ proglen”)。
我创建了一个for循环,它以数据帧列表的形式提供了所需的结果。 现在,我想将 for循环更改为基于矢量的代码

我不确定如何在R中将循环转换为基于矢量的代码。

obslen = 600 ;proglen = 50 ; N = 50 ; testdat <- list()

for (i in 1:N){ 
  test <- df[df$d >= df$d[obslen + i * proglen] &
                    df$d < df$d[proglen + obslen  +i * proglen],]
  testdat[[i]] <- test
}

变量$ d的类型为Posixct。 结果应包含N个数据帧。 这些df从[obslen + i * proglen]开始,长度为“ proglen”。

2 个答案:

答案 0 :(得分:0)

这几乎与您所做的类似,只是被lapply所取代,并且更具可读性。这将为您提供数据帧列表。这也可以通过递归函数来完成,但是(我认为)很难理解。

lapply(1:N, function(idx){
  this_idx <- obslen + idx * proglen
  next_idx <- obslen + (idx + 1) * proglen
  df[this_idx:next_idx, ]
})

答案 1 :(得分:0)

如果日期不同,则可以随时使用split函数:

testdat <- split(df[obslen + seq(1, N * proglen), ], rep(seq(N), each = proglen))