0

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

328 328 328 328 337 338 339 340 341 342 343 344 345 346 347 348 349 349 349 349 349 349 349 349 349 349 349 349

ご覧のとおり、328 は 4 回繰り返され、349 は 12 回繰り返されます。R で 328 を 328,329,330,331 に、349 を 349,350,351 に再番号付けする最も効率的な方法は何かと考えていました...

forループを使用してこれを行うことができますが、Rにはより「R中心」のアプローチがあると感じています。

4

3 に答える 3

4

これがデータなら

x = c(rep(328, 4), rep(349, 12))

それのランレングスエンコーディング表現を作成できます

r = rle(x)

次に、各実行の長さに等しいシーケンスを作成します

s = lapply(r$lengths, seq_len)

最後に、これらを元のデータに追加します (マイナス 1。前のステップで作成されたシーケンスは 1 から始まるため)。

unlist(Map("+", s, r$values - 1)

そう

> r = rle(x)
> unlist(Map("+", lapply(r$lengths, seq_len), r$values - 1))
 [1] 328 329 330 331 349 350 351 352 353 354 355 356 357 358 359 360

(ただし、@DWinの使用seqはよりクリーンです)。firstの値を順序付けすることはx、まだ順序付けられていない場合でも意味があります。

> (x = sample(x))
 [1] 349 349 349 349 349 349 328 349 349 328 328 328 349 349 349 349
> o = order(x)
> r = rle(x[o])
> unlist(Map(seq, r$values, length=r$length))[order(o)]
 [1] 349 350 351 352 353 354 328 355 356 329 330 331 357 358 359 360
于 2012-05-31T19:02:06.697 に答える
2
# Demonstrating efficient way to take comma-less sequence as input from console.

> x <- scan()
 1: 328 328 328 328 337 338 339 340 341 342 343 344 345 346 347 348 349 349 349 349 349 349 349 349 349 349 349 349
29: 
Read 28 items

# Solution
unlist( mapply(seq, rle(x)$values, length=rle(x)$lengths ) )
# [1] 328 329 330 331 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
# [26] 358 359 360

rlemapply明らかな出発点のように見えましたが、@MartinMorganのMapソリューションを見るまで、アプローチについて考えませんでした

于 2012-05-31T19:06:46.597 に答える
1

vec重複するシーケンスの場合

Reduce(function(x,y) if (y %in% x) c(x, max(x) + 1) else c(x, y), vec[order(vec)])
于 2012-05-31T19:09:19.177 に答える