R 使用二进制变量创建计数器

R 使用二进制变量创建计数器,r,counter,R,Counter,我试图创建一个计数器变量,每当二进制变量发生变化时,该计数器变量从1开始 bin <- c(1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0) df <- as.data.frame(bin) df <- df %>% group_by(bin) %>% mutate(cntr = row_number()) 但我得到的是: 1 1 0 1 0 2 1 2 1 3 1 4

我试图创建一个计数器变量,每当二进制变量发生变化时,该计数器变量从1开始

bin <- c(1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0)
df <- as.data.frame(bin)

df <- df %>%
  group_by(bin) %>%
  mutate(cntr = row_number())
但我得到的是:

1    1
0    1
0    2
1    2
1    3
1    4

我明白为什么这是。。。我只是不知道如何得到我想要的结果。任何帮助都将不胜感激。

我们需要一个
运行长度id
将相邻的相同元素分组为一个组。可以使用
data.table中的
rleid
完成,或者创建一个逻辑索引,然后进行累计和(
cumsum(bin!=lag(bin,default=first(bin)))


您可以通过组合
序列
rle
轻松实现这一点。不需要包装

data.frame(bin, cntr = sequence(rle(bin)$lengths))
#   bin cntr
#1    1    1
#2    0    1
#3    0    2
#4    1    1
#5    1    2
#6    1    3
#7    1    4
#8    1    5
#9    0    1
#10   0    2
#11   0    3
#12   0    4
#13   1    1
#14   0    1
#15   1    1
#16   0    1
library(data.table)
library(dplyr)
df %>% 
   group_by(grp = rleid(bin))  %>% 
   mutate(cntr = row_number()) %>%
   ungroup %>%
   select(-grp)
# A tibble: 16 x 2
#     bin  cntr
#   <dbl> <int>
# 1     1     1
# 2     0     1
# 3     0     2
# 4     1     1
# 5     1     2
# 6     1     3
# 7     1     4
#..
library(data.table)
setDT(df)[, cntr := rowid(rleid(bin))]
df
#    bin cntr
# 1:   1    1
# 2:   0    1
# 3:   0    2
# 4:   1    1
# 5:   1    2
# 6:   1    3
# 7:   1    4
#..
data.frame(bin, cntr = sequence(rle(bin)$lengths))
#   bin cntr
#1    1    1
#2    0    1
#3    0    2
#4    1    1
#5    1    2
#6    1    3
#7    1    4
#8    1    5
#9    0    1
#10   0    2
#11   0    3
#12   0    4
#13   1    1
#14   0    1
#15   1    1
#16   0    1