填写R中距离矩阵的缺失行/列

斯坦

我有两个距离矩阵..但它们中的任何一个都可能缺少项目,并且它们可能会出现故障-例如:

矩阵#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和值在listmget循环通过listlapply得到的列名,使用unionfReducesort得到unique的元素。

lst <- mget(ls(pattern='m\\d+')) #change the pattern accordingly
Un1 <- sort(Reduce(union, lapply(lst, colnames)))

我们可以listmatrix0来创建另一个

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章