沿块添加序列

Add sequence along blocks

我希望每个 Blocks 都有一个顺序:

Blocks  MySeq     
1      1        
1      2       
2      1        
2      2       
1      1        
1      2        
1      3        
1      4        
3      1        
3      2        
3      3        
4      1
4      2
4      3
4      4

基于this 我试过了

myDf %>% dplyr::mutate(MySeq= seq(1:length(unique(Blocks)),rle(Blocks)$"lengths")

但是,序列不会随着每个新块而重置。见下文:

Blocks  MySeq     
    1      1        
    1      2       
    2      1        
    2      2       
    1      3        
    1      4        
    1      5        
    1      6        
    3      1        
    3      2        
    3      3        
    4      1
    4      2
    4      3
    4      4

我怎样才能从每个个体制作一个新序列Blocks

试试这个

unlist(sapply(rle(df1$Blocks)$lengths,seq_len))

我们可以通过将 'Blocks' 的 rleid 分组并分配 (:=) 'MySeq' 作为序列来使用 data.table 中的 rleid行数。

library(data.table)
setDT(df1)[, MySeq := seq_len(.N) , .(rleid(Blocks))]
df1
#    Blocks MySeq
# 1:      1     1
# 2:      1     2
# 3:      2     1
# 4:      2     2
# 5:      1     1
# 6:      1     2
# 7:      1     3
# 8:      1     4
# 9:      3     1
#10:      3     2
#11:      3     3
#12:      4     1
#13:      4     2
#14:      4     3
#15:      4     4

或者如果我们使用 base R,那么 lengthssequence 将获得预期的输出

sequence(rle(df1$Blocks)$lengths)
#[1] 1 2 1 2 1 2 3 4 1 2 3 1 2 3 4

数据

df1 <- structure(list(Blocks = c(1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 3L, 
3L, 3L, 4L, 4L, 4L, 4L)), .Names = "Blocks", row.names = c(NA, 
 -15L), class = "data.frame")