Estoy tratando de descubrir cómo ordenar una tabla de datos R basada en el encadenamiento de 2 columnas.
Aquí está mi muestra 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
Necesito el orden de la fila para comenzar con col1 = 0. El valor de col1 en la fila 2 debe ser igual al valor de col2 en la fila anterior, y así sucesivamente.
Además, generalmente siempre debe haber un valor coincidente que encadene el orden de las filas. Pero si no, debe seleccionar el valor más cercano (ver filas 4 y 5 a continuación).
El resultado que estoy buscando se muestra a continuación:
id col1 col2
1: A 0 5703
2: A 5703 5222
3: A 5222 7521
4: A 7521 7907
5: A 7915 8004
Creo que puedo escribir una función loca para hacer esto ... pero me pregunto si hay una solución elegante de data.table.
EDITAR
Actualicé la tabla para incluir una ID adicional con filas duplicadas y una columna fuente única:
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
Puede haber valores coincidentes dentro de una ID. Ver B, filas 7 y 9 arriba. Sin embargo, hay una fuente única para cada fila de donde provienen estos datos.
El resultado deseado sería:
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
En la salida, las filas coincidentes, 8 y 9 podrían estar en cualquier orden.
¡Gracias!
fuente
col2
duplicados en una identificación? Su ejemplo funcionaría tal cual, pero si hubiera más filas,col2
sería 1625 o no coincidiría.Respuestas:
Aquí hay otro enfoque que:
col2
coincidecol1
.Si lo está haciendo con la agrupación, puede ajustar el ciclo dentro de a
dt[, .I[{...}, by = id]$V1
para devolver los índices. O para que se vea mejor, podemos hacer una función.fuente
Aquí hay una opción
igraph
condata.table
:salida:
datos:
fuente
col*