你可以使用ave
功能:
ave(rep(1, length(a)), a, FUN=cumsum)
# [1] 1 1 1 1 2 1 1 3 1
Run Code Online (Sandbox Code Playgroud)
关注@ lmo的评论,第二部分:
alldups <- duplicated(a) | duplicated(a, fromLast = TRUE)
res <- ave(rep(1, length(a)), a, FUN=cumsum)
res[!alldups] <- 0
# [1] 1 0 0 0 2 0 0 3 0
Run Code Online (Sandbox Code Playgroud)