1

我目前的问题如下。我有一个很大的矩阵列表(大约 1600 个)。实际上它是具有不同大小(从 2:2 到 5:5)的团的邻接矩阵。这是2个矩阵的示例

第一的

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

第二个

           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

2

我们从输入矩阵的行名和列名中创建一个matrix0 的 ('mN'),其中行名和列名来自向量 ('rn/cn')union的维数。length我们将所有矩阵放在list( lst) 中,遍历矩阵,将与各个矩阵的行/列索引对应的“mN”的值更改为 1,sum并将对应的list元素更改为Reduce

lst <- list(m1, m2)
rn <- Reduce(union, lapply(lst, rownames))
cn <- Reduce(union, lapply(lst, colnames))
mN <- matrix(0, ncol=length(cn), nrow=length(rn), dimnames=list(rn, cn))

Reduce(`+`,lapply(lst, function(x) {mN[rownames(x), colnames(x)] <- 1; mN})) 
#      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

如果有多个元素的匹配行/列名称,这将执行sum

lst <- list(m1, m2, m1)

并重复上述步骤

#      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

数据

m1 <- structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Dim = c(3L, 
3L), .Dimnames = list(c("name1", "name2", "name3"), c("name1", 
"name2", "name3")))

m2 <- structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), .Dim = c(4L, 4L), .Dimnames = list(c("name4", "name5", 
"name6", "name7"), c("name4", "name5", "name6", "name7")))
于 2015-09-28T14:04:15.973 回答
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

这也适用于重叠的派系。

编辑可以通过以下方式隐藏循环:

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-ideomatic 的如下:

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 回答