我有两个距离矩阵..但它们中的任何一个都可能缺少项目,并且它们可能会出现故障-例如:
矩阵#1(缺少项c)
a b d
a 0 2 3
b 2 0 4
d 3 4 0
矩阵#2(缺少项目b,并且项目乱序)
d c a
d 0 1 2
c 1 0 1
a 2 1 0
我想找出所有矩阵之间的差异,同时假设所有缺失项均为0。因此,我得到的矩阵应为:
a b c d
a 0 2 1 1
b 2 0 0 4
c 1 0 0 1
d 1 4 1 0
最好的方法是什么?我应该同时对两个矩阵进行排序,然后填写缺失的列/行,以便我可以再输入abs(m1-m2),或者是否有一种使用行/列标题的方法让它们在减去时自动“匹配”?
这些矩阵大约为5000x5000,我将进行大约1000的成对比较,因此,我希望对数据进行预处理,如果这样做会使每个计算速度显着提高。
欢迎任何提示或建议。我通常是非R程序员,所以我通常会提出的迭代解决方案将永远花掉-我希望做事的“ R方式”会大大加快。
我们创建一个名称索引('Un1'),该名称索引是union
第一个('m1')和第二个('m2')的名称matrix
。通过基于“ 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
和值在list
用mget
。循环通过list
与lapply
得到的列名,使用union
如f
在Reduce
,sort
得到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)))
我们可以使用,使用“ lst”的对应矩阵的行/列索引来更改“ lst1”的对应元素Map
。
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='_')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句