沿块添加序列

时间:2016-07-28 15:42:14

标签: r sequence

我希望每个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制作新序列?

2 个答案:

答案 0 :(得分:2)

试试这个

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

答案 1 :(得分:1)

我们可以使用rleid中的data.table对{块'rleid进行分组,并将(:=)'MySeq'指定为行序列。

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,那么sequence的{​​{1}}将获得预期的输出

lengths

数据

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