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
igraph
, podría ser realmente interesante.