我想要一个与cumsum等效的函数,但不是加起来它计算到目前为止唯一值的数量。我可以为每个潜在的集合编写一个循环,但由于我的数据集有数百万的观察结果,这似乎会花费很多时间。
示例:
a <- c(1,3,2,4,1,5,2,3)
f(a)
[1] 1 2 3 4 4 5 5 5
答案 0 :(得分:10)
您可以尝试:
cumsum(!duplicated(a))
#[1] 1 2 3 4 4 5 5 5
答案 1 :(得分: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