1

現時点で私の問題は次のとおりです。私は行列の大きなリスト(約1600)を持っています。実際には、さまざまなサイズ (2:2 から 5:5) のクリークの隣接行列です。ここに2つの行列の例があります

最初

            name1      name2      name3
name1          1          1          1 
name2          1          1          1
name3          1          1          1

そして2番目

           name4       name5      name6      name7
name4          1          1          1          1
name5          1          1          1          1
name6          1          1          1          1
name7          1          1          1          1

このマトリックスをより大きなマトリックスにマージして、次のようなものにする必要があります。

           name1    name2     name3     name4     name5     name6    name7
name1          1          1          1       0         0        0        0
name2          1          1          1       0         0        0        0
name3          1          1          1       0         0        0        0
name4          0          0          0       1         1        1        1
name5          0          0          0       1         1        1        1
name6          0          0          0       1         1        1        1
name7          0          0          0       1         1        1        1

でもこれが全てじゃない。同様のクリーク(例の最初のものなど)、または古い名前を含む別のクリークがある場合、その値を大きなマトリックスの値で要約したいと思います。そして、次の形式の行列を取得します。

           name1    name2     name3     name4     name5     name6    name7
name1          2          2          2       0         0        0        0
name2          2          2          2       0         0        0        0
name3          2          2          2       0         0        0        0
name4          0          0          0       1         1        1        1
name5          0          0          0       1         1        1        1
name6          0          0          0       1         1        1        1
name7          0          0          0       1         1        1        1

ソーシャル ネットワークのリンクの力を特定するには、これらの数値が必要です。

この問題は私にとって非常に複雑に思えるので、十分に明確に説明したいと思います:)

4

2 に答える 2

1

次のようなものがそれを行うはずです:

# Toy data
m1 <- matrix(1, 4, 4, dimnames = list(paste0("name", 1:4), paste0("name", 1:4)))
m2 <- matrix(1, 5, 5, dimnames = list(paste0("name", 5:9), paste0("name", 5:9)))

# Create "your list"
mlist <- list(m1, m2, m1)

戦略は、すべてのノード/名前でマトリックスを作成し、これにクリークを追加することです。

# Get all names
nms <- unique(unlist(lapply(mlist, colnames)))

# Create matrix to hold values
ans <- matrix(0, length(nms), length(nms), dimnames = list(nms, nms))

# Fill in values:
for (i in seq_along(mlist)) {
  n <- colnames(mlist[[i]])
  ans[n, n] <- ans[n, n] + mlist[[i]]
}
print(ans)
#      name1 name2 name3 name4 name5 name6 name7 name8 name9
#name1     2     2     2     2     0     0     0     0     0
#name2     2     2     2     2     0     0     0     0     0
#name3     2     2     2     2     0     0     0     0     0
#name4     2     2     2     2     0     0     0     0     0
#name5     0     0     0     0     1     1     1     1     1
#name6     0     0     0     0     1     1     1     1     1
#name7     0     0     0     0     1     1     1     1     1
#name8     0     0     0     0     1     1     1     1     1
#name9     0     0     0     0     1     1     1     1     1

これは、クリークが重複している場合にも機能するはずです。

EDITループは次のようなもので隠すことができます:

ans <- matrix(0, length(nms), length(nms), dimnames = list(nms, nms))
lapply(mlist, function(m) {n <- rownames(m); ans[n,n] <<- ans[n,n] + m})
print(ans)
# .. as above ...

しかし、おそらくよりR-イデオマティックなものは次のとおりです。

ans <- matrix(0, length(nms), length(nms), dimnames = list(nms, nms))
tmp <- lapply(mlist, function(m) {ans[rownames(m),colnames(m)] <-  m; ans})
print(Reduce("+", tmp))
# .. as above ...

Reduce@akrunの回答と同様の方法で使用します。

于 2015-09-28T14:19:07.483 に答える