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