Я пытаюсь выяснить, как упорядочить таблицу данных R на основе цепочки из 2 столбцов.
Вот мой пример data.table.
dt <- data.table(id = c('A', 'A', 'A', 'A', 'A')
, col1 = c(7521, 0, 7915, 5222, 5703)
, col2 = c(7907, 5703, 8004, 7521, 5222))
id col1 col2
1: A 7521 7907
2: A 0 5703
3: A 7915 8004
4: A 5222 7521
5: A 5703 5222
Мне нужно, чтобы порядок строк начинался с col1 = 0. Значение col1 в строке 2 должно быть равно значению col2 в предыдущая строка и т. д.
Кроме того, обычно всегда должно быть совпадающее значение, связывающее порядок строк. Но если нет, следует выбрать ближайшее значение (см. Строки 4 и 5 ниже).
Результат, который я ищу, показан ниже:
id col1 col2
1: A 0 5703
2: A 5703 5222
3: A 5222 7521
4: A 7521 7907
5: A 7915 8004
Я думаю, что могу написать сумасшедшая функция для этого ... но мне интересно, есть ли элегантное решение для data.table.
EDIT
Я обновил таблицу, добавив дополнительный идентификатор с повторяющимися строками и уникальный исходный столбец:
dt <- data.table(id = c('A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B')
, col1 = c(7521, 0, 7915, 5222, 5703, 1644, 1625, 0, 1625, 1625)
, col2 = c(7907, 5703, 8004, 7521, 5222, 1625, 1625, 1644, 1625, 1505)
, source = c('c', 'b', 'a', 'e', 'd', 'y', 'z', 'x', 'w', 'v'))
id col1 col2 source
1: A 7521 7907 c
2: A 0 5703 b
3: A 7915 8004 a
4: A 5222 7521 e
5: A 5703 5222 d
6: B 1644 1625 y
7: B 1625 1625 z
8: B 0 1644 x
9: B 1625 1625 w
10: B 1625 1505 v
В идентификаторе могут быть совпадающие значения. Смотрите B, строки 7 и 9 выше. Однако для каждой строки, откуда поступают эти данные, существует уникальный источник.
Желаемый результат будет:
id col1 col2 source
1: A 0 5703 b
2: A 5703 5222 d
3: A 5222 7521 e
4: A 7521 7907 c
5: A 7915 8004 a
6: B 0 1644 x
7: B 1644 1625 y
8: B 1625 1625 w
9: B 1625 1625 z
10: B 1625 1625 v
В выходных данных соответствующие строки, 8 и 9, могут находиться в Любой заказ.
Спасибо!