R将数字向量转换为跳过索引

时间:2013-09-24 20:54:11

标签: r

我有一个宽度向量

ws = c(1,1,2,1,3,1)

从这个载体我想要另一个这种形式的载体:

indexes = c(1,2,3,5,6,7,9,11,12)

为了创建这样的向量,我在R中执行了以下循环:

ws = c(1,1,2,1,3,1)
indexes = rep(0, sum(ws))
counter = 1
counter2 = 1
last = 0
for(i in 1:length(ws))
{
  if (ws[i] == 1)
  {
    indexes[counter] = counter2
    counter = counter + 1
  } else {
    for(j in 1:ws[i])
    {
      indexes[counter] = counter2
      counter = counter + 1
      counter2 = counter2+2
    }
    counter2 = counter2 - 2
  }
  counter2 = counter2+1
}

逻辑如下,ws中的每个元素指定索引中相应的元素数。例如,如果ws是1,则索引中的元素的相应数量是1,但是如果ws是> 1。 1,让我们说3,索引中元素的相应数量是3,并且元素被逐个跳过,对应于3,5,7。

但是,我想避免for循环,因为它们在R中往往很慢。你对如何仅通过向量运算实现这样的结果有任何建议吗?还是一些更奇妙的解决方案?

谢谢!

1 个答案:

答案 0 :(得分:5)

这是一个矢量化的单行代码:

ws <- c(1,1,2,1,3,1)

cumsum((unlist(sapply(ws, seq_len)) > 1) + 1)
# [1]  1  2  3  5  6  7  9 11 12

你可以一块一块地将它拆开,从里到外工作,看看它是如何工作的。