У меня есть такие данные:
structure(list(step_origin = c(4897L, 3105L, 129L, 2689L, 2945L,
161L), step_destination = c(3105L, 1057L, 2689L, 2945L, 3201L,
673L)), row.names = c(NA, -6L), class = c("data.table", "data.frame"
), .internal.selfref = <pointer: 0x000001a52ad81ef0>)
в удобной для человека форме это выглядит так:
step_origin step_destination
1: 4897 3105
2: 3105 1057
3: 129 2689
4: 2689 2945
5: 2945 3201
6: 161 673
каждая строка представляет шаг в каком-то процессе, первый столбец указывает источникшага, а второй столбец указывает, где заканчивается шаг.
Если step_destination
в одной строке совпадает с step_origin
другой строки, то эти два шага связаны.
Я хочу найти все связанные шаги и упорядочить их от первого до последнего (поскольку первый шаг - это тот, который начинается с номера, который не записан как пункт назначения в любой другой строке, аналогично последовательность шагов заканчивается пунктом назначения, которыйне одновременно и источник).
Я могу представить два желаемых результата, которые я хотел бы получить:
- список, где каждый элемент списка хранит вектор соответствующегошаги.
- таблица данных, где каждая строка хранит связанные шаги, а количество столбцов в таблице данных соответствует длине самой длинной последовательности шагов.
Данныетаблица в этом случае будет выглядеть следующим образом:
sequence_id step_1 step_2 step_3 step_4
1: 1 129 2689 2945 3201
2: 2 161 673 NA NA
3: 3 4897 3105 1057 NA
Теперь я хотел бы, чтобы метод динамически определял, сколько столбцов должна иметь результирующая таблица, но на практике я знаю, что будет не более 12 последовательных шагов..
РЕДАКТИРОВАТЬ:
первоначальный вопрос уже был дан ответ, однако мой реальный сценарий оказывается немного сложнее, чем я первоначально ожидал.
Процесс, описанный выше, может фактически перемещаться из одного источника в два разных пункта назначения.
Пример данных:
structure(list(step_origin = c(3105, 2689, 2689, 1610), step_destination = c(2689,
2945, 3201, 6730), time = c("2019-03-27 13:24:07", "2019-03-27 20:46:58",
"2019-03-28 16:02:57", "2019-03-28 16:12:44")), row.names = c(NA,
-4L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x000001a52ad81ef0>)
, который выглядит как:
step_origin step_destination time
1: 3105 2689 2019-03-27 13:24:07
2: 2689 2945 2019-03-27 20:46:58
3: 2689 3201 2019-03-28 16:02:57
4: 1610 6730 2019-03-28 16:12:44
Что в основном означает, что с 2689
процесс разделяется на 2945
и 3201
.Обратите внимание, что один пункт назначения всегда достигается только от одного источника, но один источник может иметь несколько пунктов назначения.
Я могу добраться до:
sequence_id step_1 step_2 step_3
1: 1 3105 2689 2945
2: 2 2689 3201 NA
3: 3 1610 6730 NA
Используя уже предложенные подходы, однако в этомВ этом случае я хотел бы иметь
sequence_id step_1 step_2 step_3
1: 1 3105 2689 2945
2: 2 3105 2689 3201
3: 3 1610 6730 NA
, что указывало бы на то, что пункты назначения 2945 и 3201 были достигнуты с начала в 3105.