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