2017-01-23 1 views
-1

I ont la structure de données suivante ...Tourner une longue structure de données à une large structure matricielle

 ID value 

1 1  1 
2 1  63 
3 1  2 
4 1  58 
5 2  3 
6 2  4 
7 3  34 
8 3  25 

Maintenant, je veux en faire une sorte de structure de données dyadique. Chaque ID avec la même valeur devrait avoir une relation.

J'ai essayé plusieurs options et:

df_wide <- dcast(df, ID ~ value) 

... me jettes un long chemin sur la route ...

ID 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 
1  1001 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
2  1006 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
3  1007 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 
4  1011 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
5  1018 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
6  1020 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 
7  1030 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 
8  1036 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

Maintenant mon principal problème de la transformer en un bon matrice pour en extraire un objet igraph.

df_wide_matrix <- data.matrix(df_wide) 

df_aus_wide_g <- graph.edgelist(df_wide_matrix ,directed = TRUE) 

ne me lancez pas là ...

J'ai essayé aussi de le transformer en une matrice de contiguïté ...

df_wide_matrix <- get.adjacency(graph.edgelist(as.matrix(df_wide), directed=FALSE)) 

... mais ça n'a pas non plus

Répondre

1

Si vous voulez créer un bord entre tous les ID avec la même valeur, essayez quelque chose comme ceci à la place. Premier merge le cadre de données sur lui-même par le value. Ensuite, supprimez la colonne value et supprimez tous les bords (non dirigés) qui sont dupliqués ou uniquement des points. Enfin, convertissez en une matrice à deux colonnes et créez les arêtes.

res <- merge(df, df, by='value', all=FALSE)[,c('ID.x','ID.y')] 
res <- res[res$ID.x<res$ID.y,] 
resg <- graph.edgelist(as.matrix(res)) 
+0

ah bonne idée ... merci! –