将重复值标记为重复时间

时间:2018-02-22 18:28:06

标签: r

我正在处理具有重复值的数据,我希望得到重复值的时间。

例如,如果我有:

test_list <- c(0,1,2,2,2,3,4,5,5,6,7,7,7,7)

我应用了重复的功能dups <- duplicated(test_list),我们有dups

[1] FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE
[9]  TRUE FALSE FALSE  TRUE  TRUE  TRUE

对于这个dups,我想用索引标记TRUE序列,以表示该值复制的时间。例如,我想最终:

[1] 0 0 0 1 2 0 0 0 1 0 0 1 2 3

你们可以给我一些关于如何做到这一点的提示吗?谢谢!

2 个答案:

答案 0 :(得分:1)

我们可以通过ave进行操作来获取序列,然后从中减去1

ave(test_list, test_list, FUN = seq_along)-1
#[1] 0 0 0 1 2 0 0 0 1 0 0 1 2 3

答案 1 :(得分:0)

不知何故,我认为必须有更好的方法来使用cumsum()或类似的东西来做到这一点。但这适用于你的例子。

test_list <- c(0,1,2,2,2,3,4,5,5,6,7,7,7,7)
dups <- duplicated(test_list)

adding.it <- 0
dup.func <- function(x){
  if(x == FALSE){
    adding.it <<- 0
    return(0)
  }else{
    adding.it <<- adding.it + 1
    return(adding.it)
  }
}

result <- sapply(dups, dup.func)
result
#[1] 0 0 0 1 2 0 0 0 1 0 0 1 2 3