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更干净)。x如果还没有按顺序排列,那么对 first 的值进行排序是有意义的。

> (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

rle看起来确实是一个明显的起点,但mapply直到我看到@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 回答