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

矩阵#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方式”会大大加快。

===============>>#1 票数:2 已采纳

我们创建了一个名称索引(“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获得对象名称,并使用mget获得list的值。 lapply遍历list以获取列名,在Reduce中将union用作fsort以获取unique元素。

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

我们可以创建另一个matrix为0的list

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='_')

===============>>#2 票数:2

使用match另一种方法(开始类似于@akrun):

func = function(cols, m)
{
    res = `dimnames<-`(m[match(cols,rownames(m)), match(cols,colnames(m))],
                       list(cols, cols))
    ifelse(is.na(res), 0, res)
}


cols = sort(union(colnames(m1), colnames(m2)))
abs(func(cols,m1) - func(cols,m2))
#  a b c d
#a 0 2 1 1
#b 2 0 0 4
#c 1 0 0 1
#d 1 4 1 0

  ask by Stan translate from so

未解决问题?本站智能推荐:

1回复

返回R中距离矩阵的两半

我有一个外部距离对象( gdis ),需要将其转换为包含距离矩阵的两半的矩阵。 我目前正在使用打印功能来实现这一目标。 每次运行脚本时都必须打印出整个矩阵,这是相当笨拙的。 有什么方法可以避免这种情况吗?
2回复

R-如何从距离矩阵中获取匹配元素的行和列下标

我有一个整数向量vec1 ,正在使用dist函数生成一个远距离矩阵。 我想在距离矩阵中获取某个值的元素的坐标(行和列)。 从本质上讲,我想将这对元素分开d距离。 例如: 说,我对向量中相距5个单位的一对元素感兴趣。 我想获得分别是距离矩阵的行和坐标2的列的coordinate1。
1回复

R:两个矩阵的列之间的成对欧几里得距离

以下循环花费的时间太长,无法运行(2分钟/迭代),tumor_signals的大小为950000x422,normal_signals的大小为950000x772,如何加速它的任何想法?
6回复

R中的平行距离矩阵

目前,我正在使用内置函数dist来计算R中的距离矩阵。 当前这是应用程序的瓶颈,因此该想法是使该任务并行化(从概念上讲应该可行) 搜索谷歌和这个论坛没有成功。 有人有主意吗?
2回复

R中的有符号距离矩阵

[注意,我写出了这个问题,然后找到答案。 我想也许其他人想知道它,所以我发布答案以防万一。 我不确定这是否是“完成的事情”]。 假设我想要一个向量的带符号距离矩阵,即距离不总是正的,但可以是负的。 你不能使用 DIST() 因为它返回绝对值。
4回复

距离矩阵到R中的成对距离列表

如果我的输入文件是距离矩阵,是否有任何R包来获得成对距离列表例如,如果我的输入是data.frame,如下所示: 我希望输出为: 我发现了一个问题,使用包'reshape'来做相反的功能,但无法调整它以获得我想要的东西。
1回复

R距离矩阵构建

R的新手。我在R中有几个组件的坐标矩阵,如下所示: 我的问题是如何建立R中每个分量对的距离矩阵,例如:
2回复

谷歌api距离矩阵到R

我通过谷歌api服务计算了城市之间的距离。 我需要将距离放入R中的距离矩阵,但是当我使用代码时: 如果我然后键入“pagetree”我收到一条错误消息。 有人可以帮帮我吗? 谢谢你,索菲亚p。
1回复

如何有效地从“ dist”距离矩阵中提取行或列

我正在使用39000+个数据点,并且正在计算一个点与每个其他点之间的距离,导致(39000 +)^ 2矩阵消耗11GB(而我无法在其中分配记忆)。 很棒的事情是,我们具有dist函数,该函数可使我将其减少到不到6GB。 但是现在,我需要计算由2乘以的逆距离,然后对每一行进行正则化,使它们
2回复

加快R算法以计算Hellinger距离的距离矩阵

我正在寻找一种加速此算法的方法。 我的情况如下。 我有一个25,000个用户的6个习惯数据集。 我的目标是为25,000个用户开发分层集群。 我在具有16核,128GB RAM的服务器上运行此服务器。 我花了3个星期,仅用10,000个用户就在我的服务器上不停地使用6核来计算此距离