我们创建一个名称索引 ('Un1'),它是第一个 ('m1') 和第二个 ('m2') matrix 的名称的 union。通过基于 'Un1' 指定尺寸和暗淡名称来创建两个新的 0 矩阵('m1N'、'm2N')。通过行/列索引,我们将这些矩阵中的0值改为'm1'、'm2'中的值,相减得到绝对值。
Un1 <- sort(union(colnames(m1), colnames(m2)))
m1N <- matrix(0, ncol=length(Un1), nrow=length(Un1), dimnames=list(Un1, Un1))
m2N <- m1N
m1N[rownames(m1), colnames(m1)] <- m1
m2N[rownames(m2), colnames(m2)] <- m2
abs(m1N-m2N)
# a b c d
#a 0 2 1 1
#b 2 0 0 4
#c 1 0 0 1
#d 1 4 1 0
更新
如果我们有多个对象名称为m 后跟数字的矩阵,我们可以将它们放在list 中。我们使用ls 获取对象名称,使用mget 获取list 中的值。循环遍历list 和lapply 以获取列名,在Reduce、sort 中使用union 作为f 以获取unique 元素。
lst <- mget(ls(pattern='m\\d+')) #change the pattern accordingly
Un1 <- sort(Reduce(union, lapply(lst, colnames)))
我们可以创建另一个list,matrix 为 0。
lst1 <- lapply(seq_along(lst), function(i)
matrix(0, ncol=length(Un1), nrow=length(Un1), dimnames=list(Un1, Un1)))
我们可以使用Map使用'lst'对应矩阵的行/列索引来改变'lst1'的对应元素。
lst2 <- Map(function(x,y) {x[rownames(y), colnames(y)] <- y; x}, lst1, lst)
如果我们需要成对差异,combn 可能是一个选项
lst3 <- combn(seq_along(lst2),2, FUN=function(x)
list(abs(lst2[[x[1]]]-lst2[[x[2]]])))
names(lst3) <- combn(seq_along(lst2), 2, FUN=paste, collapse='_')