Последовательность в r основана на другом - PullRequest
0 голосов
/ 10 января 2020

У меня есть что-то вроде:

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

Так что каждый раз, когда последовательность в генах меняется с 5 на 1, это новое животное. Есть идеи ??

Спасибо !!

Ответы [ 2 ]

3 голосов
/ 10 января 2020

Предполагая, что 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

Или использовать dplyr с lag + 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))
0 голосов
/ 10 января 2020

Поскольку вы только что упомянули, что новое животное помечается, когда «меняется с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...