我有一个相对简单的问题(我认为),我想以快速且有效的方式解决它。
我想计算向量中直到该向量中每个点的不同元素的数量。
例如,在这样的向量中
vec <- c("a", "b", "c", "a", "a", "c", "d", "a")
我想得到以下相同大小的向量作为结果:
[1 2 3 3 3 3 4 4]
我当然可以通过
for
循环结合 cumsum()
来解决这个问题:
vec <- c("a", "b", "c", "a", "a", "c", "d", "a")
res <- T
for (i in 2:length(vec)) {
res[i] <- !(vec[i] %in% vec[1:(i-1)])
}
cumsum(res)
[1] 1 2 3 3 3 3 4 4
但是,我正在处理具有数百万个元素的向量,对于这样一个相对简单的问题,for 循环方法需要很长时间。
我的直觉是,这应该可以更快、更聪明地解决。你有什么想法?谢谢!
(如果您感兴趣:我需要这个来进行词汇增长曲线分析,我们想知道文本中的每个点到目前为止已经观察到了多少不同的单词(即类型)。)
对非 (
cumsum
) !
值使用 duplicated
:
cumsum(!duplicated(vec))
#[1] 1 2 3 3 3 3 4 4