首页 文章

R - 网络数据进出R - 邻接矩阵到Edgelist格式

提问于
浏览
1

我是一名使用R进行社交网络分析的基本程序员,并且有一些我不确定如何解决的信息 .

是)我有的:

  • 存储为csv文件的邻接矩阵,其中包含以下信息:a)第1行中的住户和第1列中的住户通过共享资源相互交互 . b)相互作用是由亲属数字代表的联系 . 亲属关系越近(或越强),数字越小 . 例如,1是亲子亲属关系,100是亲属关系 . 与自己无亲属关系 . c)文件片段:

[,1] [,2] [,3] [,4] [,5]
[1,] NA 100 2 1 100
[2,] 4 NA 100 100 3
[3,] 100 3 NA 2 4
[4,] 100 1 5 NA 100
[5,] 1 100 4 100 NA

我需要的:

  • 我需要将此邻接矩阵转换为具有三列(“HH1”,“HH2”,“HHKinRank”)的边列表,以便完成额外的亲属关系计算 .

  • 必须将此边缘列表另存为新的csv文件以供进一步分析 .

  • 我对列表的最大问题是,它只需要列出数值 . 如果没有平局(NA),边缘列表会显示这个吗?

我做了什么:

我尝试将csv文件分配给新变量HHKinRank.el < - read.csv(“HouseholdKinRank.csv”) .

当我这样做时,最令人沮丧的组件是确定我可能必须使用的库 . 有许多功能命令,例如熔化,因此故障排除是一个问题,因为我也可能错误地分配值 .

我可以从边缘列表转到矩阵,但相反的是难以运行命令 .

感谢您对此提供任何帮助 .

2 回答

  • 0

    您可以使用R的 network 包执行此操作,也可以在 igraph 中执行此操作 .

    library(network)
    
    # create the example data
    adjMat <- matrix(c(NA, 100,  2,    1,    100,
                        4, NA,   100,  100,  3,
                      100, 3,    NA,   2,    4,
                      100, 1,    5,    NA,   100,
                      1,   100,  4,    100,  NA),
                     ncol = 5,byrow=TRUE)
    
    # create a network object
    net<-as.network(adjMat,matrix.type='adjacency',
                    ignore.eval = FALSE,  # read edge values from matrix as attribute
                    names.eval='kinship', # name the attribute
                    loops=FALSE)   # ignore self-edges
    
    # convert to an edgelist matrix
    el <-as.edgelist(net,attrname = 'kinship')
    
    # relabel the columns
    colnames(el)<-c("HH1", "HH2", "HHKinRank")
    
    # check results
    el
          HH1 HH2 HHKinRank
     [1,]   1   2       100
     [2,]   1   3         2
     [3,]   1   4         1
     [4,]   1   5       100
     [5,]   2   1         4
     [6,]   2   3       100
     [7,]   2   4       100
     [8,]   2   5         3
     [9,]   3   1       100
    [10,]   3   2         3
    [11,]   3   4         2
    [12,]   3   5         4
    [13,]   4   1       100
    [14,]   4   2         1
    [15,]   4   3         5
    [16,]   4   5       100
    [17,]   5   1         1
    [18,]   5   2       100
    [19,]   5   3         4
    [20,]   5   4       100
    
    # write edgelist matrix to csv file
    write.csv(el,file = 'myEdgelist.csv')
    
  • 0

    原始数据:

    adj_mat <- matrix(
      c(NA, 100, 2, 1, 100,
        4, NA, 100, 100, 3,
        100, 3, NA, 2, 4,
        100, 1, 5, NA, 100,
        1, 100, 4, 100, NA
        ),
      nrow = 5, ncol = 5, byrow = TRUE
      )
    
    adj_mat
    #>      [,1] [,2] [,3] [,4] [,5]
    #> [1,]   NA  100    2    1  100
    #> [2,]    4   NA  100  100    3
    #> [3,]  100    3   NA    2    4
    #> [4,]  100    1    5   NA  100
    #> [5,]    1  100    4  100   NA
    

    1)将行索引,列索引和邻接矩阵的值组合成3个矩阵的列表:

    rows_cols_vals_matrices <-  list(row_indices = row(adj_mat),
                                     col_indices = col(adj_mat), 
                                     values = adj_mat)
    rows_cols_vals_matrices
    #> $row_indices
    #>      [,1] [,2] [,3] [,4] [,5]
    #> [1,]    1    1    1    1    1
    #> [2,]    2    2    2    2    2
    #> [3,]    3    3    3    3    3
    #> [4,]    4    4    4    4    4
    #> [5,]    5    5    5    5    5
    #> 
    #> $col_indices
    #>      [,1] [,2] [,3] [,4] [,5]
    #> [1,]    1    2    3    4    5
    #> [2,]    1    2    3    4    5
    #> [3,]    1    2    3    4    5
    #> [4,]    1    2    3    4    5
    #> [5,]    1    2    3    4    5
    #> 
    #> $values
    #>      [,1] [,2] [,3] [,4] [,5]
    #> [1,]   NA  100    2    1  100
    #> [2,]    4   NA  100  100    3
    #> [3,]  100    3   NA    2    4
    #> [4,]  100    1    5   NA  100
    #> [5,]    1  100    4  100   NA
    

    2)展平矩阵:

    vectorized_matrices <- lapply(rows_cols_vals_matrices, as.vector)
    vectorized_matrices
    #> $row_indices
    #>  [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
    #> 
    #> $col_indices
    #>  [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5
    #> 
    #> $values
    #>  [1]  NA   4 100 100   1 100  NA   3   1 100   2 100  NA   5   4   1 100
    #> [18]   2  NA 100 100   3   4 100  NA
    

    3)将向量绑定到3列矩阵:

    melted <- do.call(cbind, vectorized_matrices)
    head(melted)
    #>      row_indices col_indices values
    #> [1,]           1           1     NA
    #> [2,]           2           1      4
    #> [3,]           3           1    100
    #> [4,]           4           1    100
    #> [5,]           5           1      1
    #> [6,]           1           2    100
    

    4)删除第3列为NA的行:

    filtered <- melted[!is.na(melted[, 3]), ]
    filtered
    #>       row_indices col_indices values
    #>  [1,]           2           1      4
    #>  [2,]           3           1    100
    #>  [3,]           4           1    100
    #>  [4,]           5           1      1
    #>  [5,]           1           2    100
    #>  [6,]           3           2      3
    #>  [7,]           4           2      1
    #>  [8,]           5           2    100
    #>  [9,]           1           3      2
    #> [10,]           2           3    100
    #> [11,]           4           3      5
    #> [12,]           5           3      4
    #> [13,]           1           4      1
    #> [14,]           2           4    100
    #> [15,]           3           4      2
    #> [16,]           5           4    100
    #> [17,]           1           5    100
    #> [18,]           2           5      3
    #> [19,]           3           5      4
    #> [20,]           4           5    100
    

    5)将它全部包装成一个函数:

    as_edgelist.adj_mat <- function(x, .missing = NA) {
      # if there arerow/colnames or non-numeric data, you'll need to to use a data frame to 
      # handle heterogenous data types
      stopifnot(is.numeric(x) & is.null(dimnames(x))) 
      melted <- do.call(cbind, lapply(list(row(x), col(x), x), as.vector))
      if (is.na(.missing)) {
        out <- melted[!is.na(melted[, 3]), ]
      } else {
        out <- melted[melted[, 3] != .missing, ]
      }
      out
    }
    

    6)拿它旋转:

    as_edgelist.adj_mat(adj_mat)
    #>       [,1] [,2] [,3]
    #>  [1,]    2    1    4
    #>  [2,]    3    1  100
    #>  [3,]    4    1  100
    #>  [4,]    5    1    1
    #>  [5,]    1    2  100
    #>  [6,]    3    2    3
    #>  [7,]    4    2    1
    #>  [8,]    5    2  100
    #>  [9,]    1    3    2
    #> [10,]    2    3  100
    #> [11,]    4    3    5
    #> [12,]    5    3    4
    #> [13,]    1    4    1
    #> [14,]    2    4  100
    #> [15,]    3    4    2
    #> [16,]    5    4  100
    #> [17,]    1    5  100
    #> [18,]    2    5    3
    #> [19,]    3    5    4
    #> [20,]    4    5  100
    

相关问题