Mapping edgelists to an adjacency matrix (and sum them together)












1















I want to map a number of (undirected) friendship networks (in edgelist format) to an adjacency matrix consisting of all possible nodes (i.e., persons) using R. To begin with, I construct a smaller 4-person circle x <- c(1, 2, 3, 4) which consists of 6 unique edges (1-2, 1-3, 1-4, 2-3, 2-4, 3-4). I then collapsed this set of 6 unique edges into a single list, such that it can be converted into a symmetric matrix using igraph applications (see below).



x = c(1,2,3,4)
x_pairs = combn(x, 2)
List <- split(x_pairs, rep(1:ncol(x_pairs), each = nrow(x_pairs)))
library(purrr)
new_list <- purrr::flatten(List)
g <- make_graph(unlist(new_list), directed = F)
m <- as_adjacency_matrix(g, sparse = F)
m

[,1] [,2] [,3] [,4]
[1,] 0 1 1 1
[2,] 1 0 1 1
[3,] 1 1 0 1
[4,] 1 1 1 0


My dataset has more than one of such smaller friendship circles consist of members out of a total of 50 persons and the memberships of these circles may or may not overlap. So my question is how do I map a series of smaller matrix values like the m above to a 50 by 50 adjacency matrix in two different ways:



(1) without repeating: say, if 3 and 4 are friends in one circle but they are also linked in another circle, the edge between 3 and 4 should remain 1 (but not add up to 2)
(2) cumulatively: if relationship in multiple circles indicates stronger friendship, then it might be more informative to map these circles into a weighted adjacency matrix where each cell in the matrix represents the cumulative counts of row and column id's friendship in different circles. In 3 and 4's situation, their edge value should be 1 + 1 = 2.



I've checked out this and other previous threads but can't seem to figure out how to do this, it will be really appreciated if someone could enlighten me on this.










share|improve this question





























    1















    I want to map a number of (undirected) friendship networks (in edgelist format) to an adjacency matrix consisting of all possible nodes (i.e., persons) using R. To begin with, I construct a smaller 4-person circle x <- c(1, 2, 3, 4) which consists of 6 unique edges (1-2, 1-3, 1-4, 2-3, 2-4, 3-4). I then collapsed this set of 6 unique edges into a single list, such that it can be converted into a symmetric matrix using igraph applications (see below).



    x = c(1,2,3,4)
    x_pairs = combn(x, 2)
    List <- split(x_pairs, rep(1:ncol(x_pairs), each = nrow(x_pairs)))
    library(purrr)
    new_list <- purrr::flatten(List)
    g <- make_graph(unlist(new_list), directed = F)
    m <- as_adjacency_matrix(g, sparse = F)
    m

    [,1] [,2] [,3] [,4]
    [1,] 0 1 1 1
    [2,] 1 0 1 1
    [3,] 1 1 0 1
    [4,] 1 1 1 0


    My dataset has more than one of such smaller friendship circles consist of members out of a total of 50 persons and the memberships of these circles may or may not overlap. So my question is how do I map a series of smaller matrix values like the m above to a 50 by 50 adjacency matrix in two different ways:



    (1) without repeating: say, if 3 and 4 are friends in one circle but they are also linked in another circle, the edge between 3 and 4 should remain 1 (but not add up to 2)
    (2) cumulatively: if relationship in multiple circles indicates stronger friendship, then it might be more informative to map these circles into a weighted adjacency matrix where each cell in the matrix represents the cumulative counts of row and column id's friendship in different circles. In 3 and 4's situation, their edge value should be 1 + 1 = 2.



    I've checked out this and other previous threads but can't seem to figure out how to do this, it will be really appreciated if someone could enlighten me on this.










    share|improve this question



























      1












      1








      1








      I want to map a number of (undirected) friendship networks (in edgelist format) to an adjacency matrix consisting of all possible nodes (i.e., persons) using R. To begin with, I construct a smaller 4-person circle x <- c(1, 2, 3, 4) which consists of 6 unique edges (1-2, 1-3, 1-4, 2-3, 2-4, 3-4). I then collapsed this set of 6 unique edges into a single list, such that it can be converted into a symmetric matrix using igraph applications (see below).



      x = c(1,2,3,4)
      x_pairs = combn(x, 2)
      List <- split(x_pairs, rep(1:ncol(x_pairs), each = nrow(x_pairs)))
      library(purrr)
      new_list <- purrr::flatten(List)
      g <- make_graph(unlist(new_list), directed = F)
      m <- as_adjacency_matrix(g, sparse = F)
      m

      [,1] [,2] [,3] [,4]
      [1,] 0 1 1 1
      [2,] 1 0 1 1
      [3,] 1 1 0 1
      [4,] 1 1 1 0


      My dataset has more than one of such smaller friendship circles consist of members out of a total of 50 persons and the memberships of these circles may or may not overlap. So my question is how do I map a series of smaller matrix values like the m above to a 50 by 50 adjacency matrix in two different ways:



      (1) without repeating: say, if 3 and 4 are friends in one circle but they are also linked in another circle, the edge between 3 and 4 should remain 1 (but not add up to 2)
      (2) cumulatively: if relationship in multiple circles indicates stronger friendship, then it might be more informative to map these circles into a weighted adjacency matrix where each cell in the matrix represents the cumulative counts of row and column id's friendship in different circles. In 3 and 4's situation, their edge value should be 1 + 1 = 2.



      I've checked out this and other previous threads but can't seem to figure out how to do this, it will be really appreciated if someone could enlighten me on this.










      share|improve this question
















      I want to map a number of (undirected) friendship networks (in edgelist format) to an adjacency matrix consisting of all possible nodes (i.e., persons) using R. To begin with, I construct a smaller 4-person circle x <- c(1, 2, 3, 4) which consists of 6 unique edges (1-2, 1-3, 1-4, 2-3, 2-4, 3-4). I then collapsed this set of 6 unique edges into a single list, such that it can be converted into a symmetric matrix using igraph applications (see below).



      x = c(1,2,3,4)
      x_pairs = combn(x, 2)
      List <- split(x_pairs, rep(1:ncol(x_pairs), each = nrow(x_pairs)))
      library(purrr)
      new_list <- purrr::flatten(List)
      g <- make_graph(unlist(new_list), directed = F)
      m <- as_adjacency_matrix(g, sparse = F)
      m

      [,1] [,2] [,3] [,4]
      [1,] 0 1 1 1
      [2,] 1 0 1 1
      [3,] 1 1 0 1
      [4,] 1 1 1 0


      My dataset has more than one of such smaller friendship circles consist of members out of a total of 50 persons and the memberships of these circles may or may not overlap. So my question is how do I map a series of smaller matrix values like the m above to a 50 by 50 adjacency matrix in two different ways:



      (1) without repeating: say, if 3 and 4 are friends in one circle but they are also linked in another circle, the edge between 3 and 4 should remain 1 (but not add up to 2)
      (2) cumulatively: if relationship in multiple circles indicates stronger friendship, then it might be more informative to map these circles into a weighted adjacency matrix where each cell in the matrix represents the cumulative counts of row and column id's friendship in different circles. In 3 and 4's situation, their edge value should be 1 + 1 = 2.



      I've checked out this and other previous threads but can't seem to figure out how to do this, it will be really appreciated if someone could enlighten me on this.







      r igraph adjacency-matrix weighted-graph






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 17 '18 at 11:52









      Henrik

      42k994110




      42k994110










      asked Nov 15 '18 at 12:34









      Chris T.Chris T.

      365318




      365318
























          1 Answer
          1






          active

          oldest

          votes


















          1














          There are various ways to achieve it. It looks like doing it in graph theoretical terms in igraph is a little more tedious than dealing directly with adjacency matrices. Let



          circles <- list(1:3, 2:4) # Friendship circles with identities 1, ..., n
          n <- max(unlist(circles)) # Total number of people
          nM <- matrix(0, n, n) # n x n matrix of zeroes


          Then



          adjs <- lapply(circles, function(cr) {nM[cr, cr] <- 1; nM[cbind(cr, cr)] <- 0; nM})


          is a list of n x n adjacency matrices for each friendship circle (mostly zeroes in each case).



          Then the two types of aggregate matrices can be obtained by



          (adj1 <- Reduce(`+`, adjs))
          # [,1] [,2] [,3] [,4]
          # [1,] 0 1 1 0
          # [2,] 1 0 2 1
          # [3,] 1 2 0 1
          # [4,] 0 1 1 0
          (adj2 <- 1 * (adj1 > 0))
          # [,1] [,2] [,3] [,4]
          # [1,] 0 1 1 0
          # [2,] 1 0 1 1
          # [3,] 1 1 0 1
          # [4,] 0 1 1 0





          share|improve this answer
























          • @ChrisT., does it answer your question or are you looking for a different approach?

            – Julius Vainora
            Nov 18 '18 at 10:16











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53319638%2fmapping-edgelists-to-an-adjacency-matrix-and-sum-them-together%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          1














          There are various ways to achieve it. It looks like doing it in graph theoretical terms in igraph is a little more tedious than dealing directly with adjacency matrices. Let



          circles <- list(1:3, 2:4) # Friendship circles with identities 1, ..., n
          n <- max(unlist(circles)) # Total number of people
          nM <- matrix(0, n, n) # n x n matrix of zeroes


          Then



          adjs <- lapply(circles, function(cr) {nM[cr, cr] <- 1; nM[cbind(cr, cr)] <- 0; nM})


          is a list of n x n adjacency matrices for each friendship circle (mostly zeroes in each case).



          Then the two types of aggregate matrices can be obtained by



          (adj1 <- Reduce(`+`, adjs))
          # [,1] [,2] [,3] [,4]
          # [1,] 0 1 1 0
          # [2,] 1 0 2 1
          # [3,] 1 2 0 1
          # [4,] 0 1 1 0
          (adj2 <- 1 * (adj1 > 0))
          # [,1] [,2] [,3] [,4]
          # [1,] 0 1 1 0
          # [2,] 1 0 1 1
          # [3,] 1 1 0 1
          # [4,] 0 1 1 0





          share|improve this answer
























          • @ChrisT., does it answer your question or are you looking for a different approach?

            – Julius Vainora
            Nov 18 '18 at 10:16
















          1














          There are various ways to achieve it. It looks like doing it in graph theoretical terms in igraph is a little more tedious than dealing directly with adjacency matrices. Let



          circles <- list(1:3, 2:4) # Friendship circles with identities 1, ..., n
          n <- max(unlist(circles)) # Total number of people
          nM <- matrix(0, n, n) # n x n matrix of zeroes


          Then



          adjs <- lapply(circles, function(cr) {nM[cr, cr] <- 1; nM[cbind(cr, cr)] <- 0; nM})


          is a list of n x n adjacency matrices for each friendship circle (mostly zeroes in each case).



          Then the two types of aggregate matrices can be obtained by



          (adj1 <- Reduce(`+`, adjs))
          # [,1] [,2] [,3] [,4]
          # [1,] 0 1 1 0
          # [2,] 1 0 2 1
          # [3,] 1 2 0 1
          # [4,] 0 1 1 0
          (adj2 <- 1 * (adj1 > 0))
          # [,1] [,2] [,3] [,4]
          # [1,] 0 1 1 0
          # [2,] 1 0 1 1
          # [3,] 1 1 0 1
          # [4,] 0 1 1 0





          share|improve this answer
























          • @ChrisT., does it answer your question or are you looking for a different approach?

            – Julius Vainora
            Nov 18 '18 at 10:16














          1












          1








          1







          There are various ways to achieve it. It looks like doing it in graph theoretical terms in igraph is a little more tedious than dealing directly with adjacency matrices. Let



          circles <- list(1:3, 2:4) # Friendship circles with identities 1, ..., n
          n <- max(unlist(circles)) # Total number of people
          nM <- matrix(0, n, n) # n x n matrix of zeroes


          Then



          adjs <- lapply(circles, function(cr) {nM[cr, cr] <- 1; nM[cbind(cr, cr)] <- 0; nM})


          is a list of n x n adjacency matrices for each friendship circle (mostly zeroes in each case).



          Then the two types of aggregate matrices can be obtained by



          (adj1 <- Reduce(`+`, adjs))
          # [,1] [,2] [,3] [,4]
          # [1,] 0 1 1 0
          # [2,] 1 0 2 1
          # [3,] 1 2 0 1
          # [4,] 0 1 1 0
          (adj2 <- 1 * (adj1 > 0))
          # [,1] [,2] [,3] [,4]
          # [1,] 0 1 1 0
          # [2,] 1 0 1 1
          # [3,] 1 1 0 1
          # [4,] 0 1 1 0





          share|improve this answer













          There are various ways to achieve it. It looks like doing it in graph theoretical terms in igraph is a little more tedious than dealing directly with adjacency matrices. Let



          circles <- list(1:3, 2:4) # Friendship circles with identities 1, ..., n
          n <- max(unlist(circles)) # Total number of people
          nM <- matrix(0, n, n) # n x n matrix of zeroes


          Then



          adjs <- lapply(circles, function(cr) {nM[cr, cr] <- 1; nM[cbind(cr, cr)] <- 0; nM})


          is a list of n x n adjacency matrices for each friendship circle (mostly zeroes in each case).



          Then the two types of aggregate matrices can be obtained by



          (adj1 <- Reduce(`+`, adjs))
          # [,1] [,2] [,3] [,4]
          # [1,] 0 1 1 0
          # [2,] 1 0 2 1
          # [3,] 1 2 0 1
          # [4,] 0 1 1 0
          (adj2 <- 1 * (adj1 > 0))
          # [,1] [,2] [,3] [,4]
          # [1,] 0 1 1 0
          # [2,] 1 0 1 1
          # [3,] 1 1 0 1
          # [4,] 0 1 1 0






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 17 '18 at 12:50









          Julius VainoraJulius Vainora

          38.1k76585




          38.1k76585













          • @ChrisT., does it answer your question or are you looking for a different approach?

            – Julius Vainora
            Nov 18 '18 at 10:16



















          • @ChrisT., does it answer your question or are you looking for a different approach?

            – Julius Vainora
            Nov 18 '18 at 10:16

















          @ChrisT., does it answer your question or are you looking for a different approach?

          – Julius Vainora
          Nov 18 '18 at 10:16





          @ChrisT., does it answer your question or are you looking for a different approach?

          – Julius Vainora
          Nov 18 '18 at 10:16




















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53319638%2fmapping-edgelists-to-an-adjacency-matrix-and-sum-them-together%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Xamarin.iOS Cant Deploy on Iphone

          Glorious Revolution

          Dulmage-Mendelsohn matrix decomposition in Python