【发布时间】:2016-02-26 06:43:29
【问题描述】:
我想要一个与 cumsum 等效的函数,但不是将它相加,而是计算迄今为止唯一值的数量。我可以为每个潜在集合编写一个循环,但这似乎会很耗时,因为我的数据集有数百万个观察值。
例子:
a <- c(1,3,2,4,1,5,2,3)
f(a)
[1] 1 2 3 4 4 5 5 5
【问题讨论】:
我想要一个与 cumsum 等效的函数,但不是将它相加,而是计算迄今为止唯一值的数量。我可以为每个潜在集合编写一个循环,但这似乎会很耗时,因为我的数据集有数百万个观察值。
例子:
a <- c(1,3,2,4,1,5,2,3)
f(a)
[1] 1 2 3 4 4 5 5 5
【问题讨论】:
你可以试试:
cumsum(!duplicated(a))
#[1] 1 2 3 4 4 5 5 5
【讨论】:
我们可以试试
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
【讨论】: