首先,(我假设)这是你的向量
a <- c("A110","A110","A110","B220","B220","C330","D440","D440","D440","D440","D440","D440","E550")
根据可能的解决方案,这里有几个(现在找不到好的骗子)
as.integer(factor(a))
# [1] 1 1 1 2 2 3 4 4 4 4 4 4 5
或者
cumsum(!duplicated(a))
# [1] 1 1 1 2 2 3 4 4 4 4 4 4 5
或者
match(a, unique(a))
# [1] 1 1 1 2 2 3 4 4 4 4 4 4 5
rle 也将在您的特定场景中以类似方式工作
with(rle(a), rep(seq_along(values), lengths))
# [1] 1 1 1 2 2 3 4 4 4 4 4 4 5
或者(实际上是一样的)
data.table::rleid(a)
# [1] 1 1 1 2 2 3 4 4 4 4 4 4 5
虽然建议所有 4 种解决方案在不同场景下都有其独特的行为,但请考虑以下向量
a <- c("B110","B110","B110","A220","A220","C330","D440","D440","B110","B110","E550")
以及 4 种不同解决方案的结果:
1.
as.integer(factor(a))
# [1] 2 2 2 1 1 3 4 4 2 2 5
factor 解决方案以2 开头,因为a 未排序,因此integer 函数中的integer 表示中的第一个值越来越高。因此,此解决方案仅在您的向量已排序时才有效,因此请勿在其他方面使用它。
2.
cumsum(!duplicated(a))
# [1] 1 1 1 2 2 3 4 4 4 4 5
这个cumsum/duplicated 解决方案被混淆了,因为"B110" 在开始时已经存在,因此将"D440","D440","B110","B110" 分组到同一个组中。
3.
match(a, unique(a))
# [1] 1 1 1 2 2 3 4 4 1 1 5
这个match/unique 解决方案在最后添加了一个,因为它对"B110" 出现在多个序列中很敏感(因为unique),因此无论它们出现在哪里,都将它们全部分组到同一组中
4.
with(rle(a), rep(seq_along(values), lengths))
# [1] 1 1 1 2 2 3 4 4 5 5 6
这个解决方案只关心序列,因此"B110"的不同序列被分组到不同的组中