Estou tentando descobrir como ordenar uma tabela de dados R com base no encadeamento de 2 colunas.
Aqui está o meu exemplo 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
Eu preciso da ordem da linha para começar com col1 = 0. O valor col1 na linha 2 deve ser igual ao valor de col2 na linha anterior e assim por diante.
Além disso, geralmente sempre deve haver um valor correspondente que encadeie a ordem das linhas. Caso contrário, ele deve selecionar o valor mais próximo (consulte as linhas 4 e 5 abaixo).
O resultado que estou procurando é mostrado abaixo:
id col1 col2
1: A 0 5703
2: A 5703 5222
3: A 5222 7521
4: A 7521 7907
5: A 7915 8004
Acho que posso escrever uma função maluca para fazer isso ... mas estou me perguntando se existe uma solução elegante de data.table.
EDIT
Atualizei a tabela para incluir um ID adicional com linhas duplicadas e uma coluna de origem exclusiva:
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
Pode haver valores correspondentes em um ID. Veja B, linhas 7 e 9 acima. No entanto, há uma fonte exclusiva para cada linha de onde esses dados vêm.
A saída desejada seria:
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
Na saída, as linhas correspondentes 8 e 9 podem estar em qualquer ordem.
Obrigado!
col2
duplicatas em um ID? Seu exemplo funcionaria como está, mas se houver mais linhas,col2
seria 1625 ou não corresponderia.