为等值的连续运行创建组号
Create group number for contiguous runs of equal values
有没有比使用循环更快的方法来制作计数器索引?对于每个连续的 运行 等值,索引应该相同。我发现循环非常慢,尤其是当数据很大时。
为了说明,这里是输入和期望的输出
x <- c(2, 3, 9, 2, 4, 4, 3, 4, 4, 5, 5, 5, 1)
所需的结果计数器:
c(1, 2, 3, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9)
请注意,非-连续的 运行 具有 不同的 索引。例如。查看值 2
和 4
的所需索引
我的低效代码是这样的:
group[1]<-1
counter<-1
for (i in 2:n){
if (x[i]==x[i-1]){
group[i]<-counter
}else{
counter<-counter+1
group[1]<-counter}
}
如果您有这样的数值,您可以使用 diff
和 cumsum
来累加值的变化
x <- c(2,3,9,2,4,4,3,4,4,5,5,5,1)
cumsum(c(1,diff(x)!=0))
# [1] 1 2 3 4 5 5 6 7 7 8 8 8 9
使用data.table
,函数rleid()
:
require(data.table) # v1.9.5+
rleid(x)
# [1] 1 2 3 4 5 5 6 7 7 8 8 8 9
这将适用于数字字符值:
rep(1:length(rle(x)$values), times = rle(x)$lengths)
#[1] 1 2 3 4 5 5 6 7 7 8 8 8 9
您还可以通过仅调用一次 rle
来提高效率(大约快 2 倍),并且 非常 可以使用 [=13] 稍微提高速度=] 而不是 rep
:
y <- rle(x)
rep.int(1:length(y$values), times = y$lengths)
以上 by Jota 可以进一步简化为,这样会更快
with(rle(x), rep(1:length(lengths), lengths))
[1] 1 2 3 4 5 5 6 7 7 8 8 8 9
有没有比使用循环更快的方法来制作计数器索引?对于每个连续的 运行 等值,索引应该相同。我发现循环非常慢,尤其是当数据很大时。
为了说明,这里是输入和期望的输出
x <- c(2, 3, 9, 2, 4, 4, 3, 4, 4, 5, 5, 5, 1)
所需的结果计数器:
c(1, 2, 3, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9)
请注意,非-连续的 运行 具有 不同的 索引。例如。查看值 2
和 4
我的低效代码是这样的:
group[1]<-1
counter<-1
for (i in 2:n){
if (x[i]==x[i-1]){
group[i]<-counter
}else{
counter<-counter+1
group[1]<-counter}
}
如果您有这样的数值,您可以使用 diff
和 cumsum
来累加值的变化
x <- c(2,3,9,2,4,4,3,4,4,5,5,5,1)
cumsum(c(1,diff(x)!=0))
# [1] 1 2 3 4 5 5 6 7 7 8 8 8 9
使用data.table
,函数rleid()
:
require(data.table) # v1.9.5+
rleid(x)
# [1] 1 2 3 4 5 5 6 7 7 8 8 8 9
这将适用于数字字符值:
rep(1:length(rle(x)$values), times = rle(x)$lengths)
#[1] 1 2 3 4 5 5 6 7 7 8 8 8 9
您还可以通过仅调用一次 rle
来提高效率(大约快 2 倍),并且 非常 可以使用 [=13] 稍微提高速度=] 而不是 rep
:
y <- rle(x)
rep.int(1:length(y$values), times = y$lengths)
以上
with(rle(x), rep(1:length(lengths), lengths))
[1] 1 2 3 4 5 5 6 7 7 8 8 8 9