J'ai 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
Ce que j'aimerais réaliser, c'est que chaque groupe trouve les voisins immédiats en fonction des codes disponibles. Par exemple: le groupe A a des groupes voisins immédiats B, C en raison de code_1 (code_1 est égal à 2 dans tous les groupes) et a des groupes voisins immédiats D, E en raison de code_3 (code_3 est égal à 4 dans tous ces groupes).
Ce que j'ai essayé, c'est pour chaque code, sous-ensemble la première colonne (groupe) en fonction des correspondances comme suit:
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
Cela "fonctionne" un peu, mais je suppose qu'il y a une façon de faire plus de tableaux de données. j'ai essayé
groups[, code_1_match_2 := list(group[code_1 == groups$code_1])]
Mais ça ne marche pas.
Suis-je en train de manquer une astuce évidente de table de données pour y faire face?
Mon résultat de cas idéal ressemblerait à ceci (ce qui nécessiterait actuellement d'utiliser ma méthode pour les 3 colonnes, puis de concaténer les résultats):
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
la source
igraph
, cela pourrait être très intéressant.Réponses:
En utilisant igraph , obtenez des voisins du 2e degré, supprimez les nœuds numériques, collez les nœuds restants.
Plus d'informations
Voici à quoi ressemblent nos données avant de les convertir en objet igraph. Nous voulons nous assurer que le code1 avec la valeur 2 est différent du code2 avec la valeur 2, etc.
Voici à quoi ressemble notre réseau:
Notez que les
A..G
nœuds sont toujours connectés viacode_x_y
. Nous devons donc obtenir le 2e degré,ego(..., order = 2)
nous donner des voisins jusqu'à inclure les voisins du 2e degré et renvoyer un objet liste.Pour obtenir les noms:
Pour embellir le résultat, nous devons supprimer les
code_x_y
nœuds et le nœud d'origine (1er nœud)la source
Il existe probablement un moyen plus pratique d'y parvenir, mais vous pouvez faire quelque chose comme ça, en utilisant des fondus et des jointures:
la source
Ceci est inspiré par la fusion de @ sindri_baldur. Cette solution:
la source
Comme mentionné par zx8754, en utilisant
data.table::melt
aveccombn
puisigraph::as_adjacency_matrix
production:
ou sans utiliser
igraph
production:
la source
xtabs
créer une sortie similaire à l'igraph
étape?table
ouxtabs