5

私は幅のベクトルを持っています、

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

このベクトルから、次の形式の別のベクトルが必要です。

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

このようなベクトルを作成するために、R で次の for ループを実行しました。

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 の各要素は、index のそれぞれの要素数を指定します。たとえば、ws が 1 の場合、インデックス内のそれぞれの要素数は 1 ですが、ws が > 1 の場合 (3 としましょう)、インデックス内のそれぞれの要素数は 3 であり、要素は 1 つずつスキップされます。 3,5,7に対応。

ただし、R では非常に遅くなる傾向があるため、for ループは避けたいと思います。ベクトル演算のみでそのような結果を達成する方法について何か提案はありますか? またはいくつかのよりクレイジーな解決策はありますか?

ありがとう!

4

1 に答える 1

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

内側から外側に向かって作業しながら、1 つずつバラバラにして、それがどのように機能するかを確認できます。

于 2013-09-24T21:05:37.030 に答える