为值的子集创建长度为 运行 的 ID

Create run-length ID for subset of values

在这种类型的数据框中:

df <- data.frame(
  x = c(3,3,1,12,2,2,10,10,10,1,5,5,2,2,17,17)
)

如何创建一个新列来记录 x 值的一个子集的 运行 长度 ID,例如 3-20

我自己的尝试只成功地插入 NA,其中 运行 长度计数应该被中断;但在内部看来计数是不间断的:

library(data.table)
df %>%
  mutate(rle = ifelse(x %in% 3:20, rleid(x), NA))
    x rle
1   3   1
2   3   1
3   1  NA
4  12   3
5   2  NA
6   2  NA
7  10   5
8  10   5
9  10   5
10  1  NA
11  5   7
12  5   7
13  2  NA
14  2  NA
15 17   9
16 17   9

预期结果

    x rle
1   3   1
2   3   1
3   1  NA
4  12   2
5   2  NA
6   2  NA
7  10   3
8  10   3
9  10   3
10  1  NA
11  5   4
12  5   4
13  2  NA
14  2  NA
15 17   5
16 17   5

在基础 R 中:

df[df$x %in% 3:20, "rle"] <- data.table::rleid(df[df$x %in% 3:20, ])

    x rle
1   3   1
2   3   1
3   1  NA
4  12   2
5   2  NA
6   2  NA
7  10   3
8  10   3
9  10   3
10  1  NA
11  5   4
12  5   4
13  2  NA
14  2  NA
15 17   5
16 17   5

left_join:

left_join(df, df %>% 
  filter(x %in% 3:20) %>% 
    distinct() %>% 
    mutate(rle = row_number()))

Joining, by = "x"
    x rle
1   3   1
2   3   1
3   1  NA
4  12   2
5   2  NA
6   2  NA
7  10   3
8  10   3
9  10   3
10  1  NA
11  5   4
12  5   4
13  2  NA
14  2  NA
15 17   5
16 17   5

data.table:

library(data.table)
setDT(df)

df[x %between% c(3,20),rle:=rleid(x)][]

        x   rle
    <num> <int>
 1:     3     1
 2:     3     1
 3:     1    NA
 4:    12     2
 5:     2    NA
 6:     2    NA
 7:    10     3
 8:    10     3
 9:    10     3
10:     1    NA
11:     5     4
12:     5     4
13:     2    NA
14:     2    NA
15:    17     5
16:    17     5