Tengo un data.table :
groups <- data.table(group = c("A", "B", "C", "D", "E", "F", "G"),
code_1 = c(2,2,2,7,8,NA,5),
code_2 = c(NA,3,NA,3,NA,NA,2),
code_3 = c(4,1,1,4,4,1,8))
group code_1 code_2 code_3
A 2 NA 4
B 2 3 1
C 2 NA 1
D 7 3 4
E 8 NA 4
F NA NA 1
G 5 2 8
Lo que me gustaría lograr es que cada grupo encuentre a los vecinos inmediatos según los códigos disponibles. Por ejemplo: el grupo A tiene grupos vecinos inmediatos B, C debido al código_1 (código_1 es igual a 2 en todos los grupos) y tiene grupos vecinos inmediatos D, E debido al código_3 (código_3 es igual a 4 en todos esos grupos).
Lo que probé es para cada código, subconjustando la primera columna (grupo) según las coincidencias de la siguiente manera:
groups$code_1_match = list()
for (row in 1:nrow(groups)){
set(groups, i=row, j="code_1_match", list(groups$group[groups$code_1[row] == groups$code_1]))
}
group code_1 code_2 code_3 code_1_match
A 2 NA 4 A,B,C,NA
B 2 3 1 A,B,C,NA
C 2 NA 1 A,B,C,NA
D 7 3 4 D,NA
E 8 NA 4 E,NA
F NA NA 1 NA,NA,NA,NA,NA,NA,...
G 5 2 8 NA,G
Este "tipo" funciona, pero supongo que hay una forma más de tabla de datos de hacer esto. Lo intenté
groups[, code_1_match_2 := list(group[code_1 == groups$code_1])]
Pero esto no funciona.
¿Me estoy perdiendo algún truco obvio de la tabla de datos para manejarlo?
El resultado de mi caso ideal sería el siguiente (que actualmente requeriría usar mi método para las 3 columnas y luego concatenar los resultados):
group code_1 code_2 code_3 Immediate neighbors
A 2 NA 4 B,C,D,E
B 2 3 1 A,C,D,F
C 2 NA 1 A,B,F
D 7 3 4 B,A
E 8 NA 4 A,D
F NA NA 1 B,C
G 5 2 8
fuente
igraph
, podría ser realmente interesante.Respuestas:
Usando igraph , obtenga vecinos de segundo grado, suelte nodos numéricos, pegue los nodos restantes.
Más información
Así es como se ven nuestros datos antes de convertirlos en un objeto igraph. Queremos asegurarnos de que el código1 con valor 2 sea diferente del código2 con valor 2, etc.
Así es como se ve nuestra red:
Tenga en cuenta que los
A..G
nodos siempre están conectados a través decode_x_y
. Por lo tanto, necesitamos obtener el segundo grado,ego(..., order = 2)
nos da vecinos hasta incluir vecinos de segundo grado y devuelve un objeto de lista.Para obtener los nombres:
Para embellecer el resultado, necesitamos eliminar los
code_x_y
nodos y el nodo de origen (primer nodo)fuente
Probablemente exista una forma más práctica de lograr esto, pero podría hacer algo como esto, utilizando fusiones y uniones:
fuente
Esto está inspirado en la fusión de @ sindri_baldur. Esta solución:
fuente
Como se menciona por zx8754, usando
data.table::melt
concombn
y luegoigraph::as_adjacency_matrix
salida:
o sin usar
igraph
salida:
fuente
xtabs
crear una salida similar aligraph
paso?table
oxtabs