2016-02-26 55 views
3

我想要一個相當於cumsum的函數,而不是加起來它計數到目前爲止的唯一值的數量。我可以爲每個潛在集合編寫一個循環,但似乎可能會耗費時間,因爲我的數據集有數百萬條觀察值。R cumunique像cumsum

例子:

a <- c(1,3,2,4,1,5,2,3) 
f(a) 
[1] 1 2 3 4 4 5 5 5 

回答

8

你可以試試:

cumsum(!duplicated(a)) 
#[1] 1 2 3 4 4 5 5 5 
2

我們可以嘗試

library(zoo) 
a[duplicated(a)] <- NA 
a[!is.na(a)] <- seq_along(a[!is.na(a)]) 
na.locf(a) 
#[1] 1 2 3 4 4 5 5 5 

或者另一種選擇是

cumsum(ave(a, a, FUN=seq_along)==1) 
#[1] 1 2 3 4 4 5 5 5 

或緊湊的辦法是

library(splitstackshape) 
getanID(a)[, cumsum(.id==1)] 
#[1] 1 2 3 4 4 5 5 5