r 中的序列基于另一个

Sequence in r based in another

我有类似的东西:

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 总是增加我们可以使用 diffcumsum

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

或使用 dplyrlag + cumsum

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))

既然你只是在 "change from 5 to 1" 时才提到一种新动物被标记,为了安全起见,你可以使用它们的差异是 -4 的标准来对动物进行分类(排除可能的"change from 4 to 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