5

我有一个向量,其中包含 1 到 5 个重复值,然后是另一个这样的集合,通常但不总是递增 1。例如,

c(1,1,1,1,1, 2,2,2,2, 3,3, 4,4,4,4,4)

我想对此进行操作,以便仅在重复给出时为每个值添加 0.2 的增量

c(1,1.2,1.4,1.6,1.8, 2,2.2,2.4,2.6, 3,3.2, 4,4.2,4.4,4.6,4.8)

我可以通过使用 for 循环很容易地做到这一点,但我的初始向量超过 100 万个条目,这需要相当长的时间。我一直在尝试提出一种基于列表的方式来做这件事,但没有运气。任何建议,将不胜感激。

4

4 回答 4

7

这是一种使用rle和序列创建序列的方法,0,0.2,0.4,....并将其添加到原始序列中。

x <- c(1,1,1,1,1, 2,2,2,2, 3,3, 4,4,4,4,4)    
x + (sequence(rle(x)$lengths)-1)*0.2
于 2013-09-27T04:18:07.260 回答
4

另一种ave可能:

ave(
  dat,
  c(0,cumsum(diff(dat)!=0)),
  FUN=function(x) x + seq(0,(length(x)-1)*0.2,0.2)
)
#[1] 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 3.0 3.2 4.0 4.2 4.4 4.6 4.8
于 2013-09-27T04:21:03.120 回答
3

这是一种可能性(假设每个数字永远不会超过一组,并且每个数字最多重复 5 次):

myvec <- c(1,1,1,1,1, 2,2,2,2, 3,3, 4,4,4,4,4)
myvec + seq(0, .8, .2)[ave(myvec, myvec, FUN = seq_along)]
# [1] 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 3.0 3.2 4.0 4.2 4.4 4.6 4.8

有关处理向量中重复数字时的更好选择,请参阅@mnel 和@thelatemail 的答案...。

于 2013-09-27T04:07:13.327 回答
1

这在非常大的链上也可能非常快。

编辑 - c_prev 使用头部而不是尾部填充。感谢@Ricardosaporta 指出

library(data.table)

test <- data.table(
c1 = c(1,1,1,1,1, 2,2,2,2, 3,3, 4,4,4,4,4)
)

test[,c_prev := c(NA,head(c1,-1))]

test[, increment := 0.0]
test[c1 == c_prev , increment := 0.2]

test[, cumincrement := cumsum(increment), by = c1]

test[, revised_c := c1]
test[!is.na(cumincrement), revised_c := revised_c + cumincrement]

test
#    c1 c_prev increment cumincrement revised_c
# 1:  1     NA       0.0          0.0       1.0
# 2:  1      1       0.2          0.2       1.2
# 3:  1      1       0.2          0.4       1.4
# 4:  1      1       0.2          0.6       1.6
# 5:  1      1       0.2          0.8       1.8
# 6:  2      1       0.0          0.0       2.0
# 7:  2      2       0.2          0.2       2.2
# 8:  2      2       0.2          0.4       2.4
# 9:  2      2       0.2          0.6       2.6
#10:  3      2       0.0          0.0       3.0
#11:  3      3       0.2          0.2       3.2
#12:  4      3       0.0          0.0       4.0
#13:  4      4       0.2          0.2       4.2
#14:  4      4       0.2          0.4       4.4
#15:  4      4       0.2          0.6       4.6
#16:  4      4       0.2          0.8       4.8
于 2013-09-27T04:23:46.293 回答