r中的序列基于另一个

r中的序列基于另一个,r,sequence,R,Sequence,我有点像: gen 1 1 2 3 4 5 1 1 1 2 2 2 3 3 4 5 1 2 3 3 4 5 我需要像这样的东西 gen 1 1 2 3 4 5 1 1 1 2 2 2 3 3 4 5 1 2 3 3 4 5 animal 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 所以每次gen的序列从5变为1,它就是一种新的动物。 有什么想法吗 谢谢 假设gen总是在增加,我们可以使用diff和cumsum df$animal <- c

我有点像:

gen
1
1
2
3
4
5
1
1
1
2
2
2
3
3
4
5
1
2
3
3
4
5
我需要像这样的东西

gen
1
1
2
3
4
5
1
1
1
2
2
2
3
3
4
5
1
2
3
3
4
5

animal
1
1
1 
1
1
1
2
2
2
2
2
2
2
2
2
2
3
3
3
3
3
3
所以每次gen的序列从5变为1,它就是一种新的动物。 有什么想法吗


谢谢

假设
gen
总是在增加,我们可以使用
diff
cumsum

df$animal <- cumsum(c(TRUE, diff(df$gen) < 0))
df
#   gen animal
#1    1      1
#2    1      1
#3    2      1
#4    3      1
#5    4      1
#6    5      1
#7    1      2
#8    1      2
#9    1      2
#10   2      2
#11   2      2
#12   2      2
#13   3      2
#14   3      2
#15   4      2
#16   5      2
#17   1      3
#18   2      3
#19   3      3
#20   3      3
#21   4      3
#22   5      3
library(dplyr)  
df %>% mutate(animal = cumsum(lag(gen, default = 5) == 5 & gen == 1))
数据

df <- structure(list(gen = c(1L, 1L, 2L, 3L, 4L, 5L, 1L, 1L, 1L, 2L, 
2L, 2L, 3L, 3L, 4L, 5L, 1L, 2L, 3L, 3L, 4L, 5L)), class = "data.frame", 
row.names = c(NA, -22L))

df由于您只提到新动物在“从5变为1”时贴上标签,为了安全起见,您可以使用其差异为
-4
的标准对动物进行分类(排除可能的情况,如“从4变为2”或部分降序的其他情况),即


你能告诉我们你到目前为止所做的代码吗?
df$animal <- 0
df$animal <- cumsum(with(df,replace(animal,na.omit(ifelse(gen[idx <- which(gen == 5)+1]==1,idx,0)),1)))
> df
   gen animal_type
1    1           0
2    1           0
3    2           0
4    3           0
5    4           0
6    5           0
7    1           1
8    1           1
9    1           1
10   2           1
11   2           1
12   2           1
13   3           1
14   3           1
15   4           1
16   5           1
17   1           2
18   2           2
19   3           2
20   3           2
21   4           2
22   5           2