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

时间:2016-02-21 19:42:16

标签: r csv adjacency-matrix sna

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

我有什么:

  1. 存储为csv文件的邻接矩阵,包含以下信息: a)第1行的家庭和第1栏的家庭通过共享资源相互作用。 b)相互作用是由亲属数字代表的联系。亲属关系越接近(或越强),数字越小。例如,1是亲子亲属关系,100是亲属关系。与自己无亲属关系。 c)文件片段:
  2.      [,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. 我需要将此邻接矩阵转换为包含三列(" HH1"," HH2"," HHKinRank")的边列表完成额外的亲属关系计算。

    2. 此边缘列表必须保存为新的csv文件以供进一步分析。

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

    4. 我做了什么:

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

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

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

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

2 个答案:

答案 0 :(得分: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')

答案 1 :(得分: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