R 像 cumsum 一样交流
R cumunique like cumsum
我想要一个与 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
我想要一个与 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