1

私は、ソーシャル ネットワーク分析に R を使用する基本的なプログラマーであり、解決方法がわからない情報をいくつか持っています。

私が持っているもの:

  1. 次の情報を含む 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

必要なもの:

  1. 追加の親族関係の計算を完了するために、この隣接行列を 3 つの列 ("HH1"、"HH2"、"HHKinRank") を持つエッジ リストに変換する必要があります。

  2. このエッジ リストは、さらに分析するために、新しい csv ファイルとして保存する必要があります。

  3. リストに関する私の最大の問題は、数値のみをリストする必要があることです。同点 (NA) がない場合、エッジ リストはこれを示しますか?

私がやった事:

csv ファイルを新しい変数 HHKinRank.el <- read.csv("HouseholdKinRank.csv") に割り当ててみました。

これを行ったとき、最も苛立たしいのは、どのライブラリを使用する必要があるかを判断することでした。メルトなどの多くの機能コマンドがあるため、値の割り当ても間違っている可能性があるため、トラブルシューティングが問題になります。

エッジ リストからマトリックスに移動できますが、その逆はコマンドを実行するのが困難です。

ご協力いただきありがとうございます。

4

2 に答える 2

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
于 2018-12-02T20:18:53.993 に答える