#r #dplyr #data-manipulation
#r #dplyr #манипулирование данными
Вопрос:
У меня есть вектор последовательных состояний (вы можете перейти только от 3 к 4, от 4 к 5 и т.д., и обратного пути нет):
cons_states <- c(3,4,5,6)
Одновременно у меня есть данные:
from to status id
2 3 1 1
2 4 0 2
2 5 0 3
2 6 0 4
2 8 0 5
2 16 0 6
3 4 0 7
3 8 0 8
3 16 1 9
16 3 0 10
16 4 0 11
16 5 0 12
16 6 0 13
16 8 1 14
8 3 0 15
8 4 1 16
8 5 0 17
8 6 0 18
У меня есть два предположения, которые я хотел бы, чтобы мои данные выполняли:
если состояние было посещено, пути назад нет, например, после посещения состояния 3 (to = 3 amp; status = 1), больше не должно быть возможности перейти в состояние 3 из следующих состояний (больше не должно быть to = 3):
from to status id
2 3 1 1
2 4 0 2
2 5 0 3
2 6 0 4
2 8 0 5
2 16 0 6
3 4 0 7
3 8 0 8
3 16 1 9
16 4 0 11
16 5 0 12
16 6 0 13
16 8 1 14
8 4 1 16
8 5 0 17
8 6 0 18
Мне удалось сделать это с помощью (я понимаю, что это некрасиво, но это работает):
ind <- data[which(data$status == 1),]
res <- NULL
for (j in 1:nrow(ind)){
ind_to <- unlist(ind [j,c("to")])
ind_id <- unlist(ind [j,c("id")])
id_remove <- data[which(data$to == ind_to amp; data$id> ind_id ),"seq"]
if(length(id_remove) == 0) next
res <- rbind(id_remove, res)
}
Что дает мне вектор идентификаторов для удаления из моих данных, который соответствует моему первому предположению.
Также я хотел бы встретить предположение, что если мы перейдем к состоянию, которое принадлежит vector cons_states, мы можем перейти только к последовательному, но не посещенному. Как мы можем видеть, принадлежит ли номер состояния в «from» вектору cons_states — проблемы не существует. В противном случае есть возможность перейти только в другие состояния, кроме последовательного.
Мой желаемый результат будет:
from to status id
2 3 1 1
2 8 0 5
2 16 0 6
3 4 0 7
3 8 0 8
3 16 1 9
16 4 0 11
16 8 1 14
8 4 1 16
Я потратил много времени, пытаясь разобраться в этом, но я застрял на написании сложных циклов, которые не работают. Есть ли какой-нибудь не очень сложный способ сделать это?
Комментарии:
1. Я думаю, что я следую первому предположению, но не второму. Не могли бы вы подробнее объяснить, почему строки удаляются для второго предположения? Возможно, более четко объясните для нескольких случаев, почему строки остались или были удалены.
2. Конечно, я обновлю свой пост после обеда. Спасибо за ответ.
3. С удовольствием просмотрите еще раз после обновления вашего сообщения.
4. Я все еще не обновил его, извините. Я был действительно занят, работая над другой вещью. Я постараюсь сделать это как можно скорее.