Arrays 按顺序改变重复

Arrays 按顺序改变重复,arrays,r,Arrays,R,我有下面的向量 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重新编号为328329330331,而349的编号为349350351 我可以使用for循环来实现这一点,但我觉得R有一种更“以R为中心”的方法。如果这是数据 x = c(r

我有下面的向量

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重新编号为328329330331,而349的编号为349350351

我可以使用for循环来实现这一点,但我觉得R有一种更“以R为中心”的方法。

如果这是数据

x = c(rep(328, 4), rep(349, 12))
您可以对其进行运行长度编码表示

r = rle(x)
然后创建与每次运行长度相等的序列

s = lapply(r$lengths, seq_len)
最后将它们添加到原始数据中(减去1,因为在上一步中创建的序列从1开始)

所以

(@DWin对
seq
的使用更干净)。如果尚未按顺序排列,
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
#演示将无逗号序列作为控制台输入的有效方法。

>x如果
vec
是重复序列

Reduce(function(x,y) if (y %in% x) c(x, max(x) + 1) else c(x, y), vec[order(vec)])

你能把它放在一个向量中,这样人们就可以直接复制/粘贴到他们的R会话中吗?这对脑筋急转弯很有用。添加print()有助于理解%
条件中的
%是如何工作的,并教会了我一些关于Reduce的非常有用的东西。谢谢
> (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
# 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
Reduce(function(x,y) if (y %in% x) c(x, max(x) + 1) else c(x, y), vec[order(vec)])