R 合并两个不同大小的矩阵

R 合并两个不同大小的矩阵,r,matrix,merge,R,Matrix,Merge,我有两个对称的相关矩阵,其中一个表示另一个的子集。我想把两个矩阵合并成长格式,以便以后在x,y图中使用。这里有一个小例子 library(reshape) library(ggplot2) dist1 <- matrix(runif(16),4,4) dist2 <- matrix(runif(9),3,3) rownames(dist1) <- colnames(dist1) <- paste0("A",1:4) rownames(dist2) <- colna

我有两个对称的相关矩阵,其中一个表示另一个的子集。我想把两个矩阵合并成长格式,以便以后在x,y图中使用。这里有一个小例子

library(reshape)
library(ggplot2)

dist1 <- matrix(runif(16),4,4)
dist2 <- matrix(runif(9),3,3)
rownames(dist1) <- colnames(dist1) <- paste0("A",1:4)
rownames(dist2) <- colnames(dist2) <- paste0("A",1:3)

m1 <- melt(dist1)
m2 <- melt(dist2)

final <- merge(m1,m2, by=c("X1","X2"))
ggplot(final, aes(value.x,value.y)) + geom_point()
很可疑的是,
final
的对表示了略多于
m2
中对的一半(差别非常接近,但不等于
m2
中对角单元格的数量),因此可能
merge()
只找到了一个三角形。但我现在的假设是m2不是m1的子集(虽然应该如此)。因此,我的问题是:

如何检查m2[,1:2]中的所有对是否也出现在m1[,1:2]中

是否有更好的选项从m1和m2创建合并数据帧,其中包含两个矩阵中包含的每个X1,X2对?最佳情况下,仅选择唯一对,例如从A1,A2和A2,A1中选择一对


谢谢。

您可以使用
dplyr中的
intersect()
函数检查m2[,1:2]中的所有对是否出现在m1[,1:2]中:

library(dplyr)
dim(intersect(m2[,1:2],m1[1:2]))
[1] 9 2
dim(m2[,1:2])
[1] 9 2
此外,尝试检查变量是否被编码为因子。如果是这样,如果合并这些变量上的数据帧,可能会得到奇怪的结果。最好将它们转换为字符

至于合并数据帧的最佳方法,
merge
来自base R,以及
dplyr
internal\u join
数据的join。table
包在处理该任务时应该足够好。
data.table
可能是最快的


如果您只需要唯一的对,那么在进行合并之前应该运行
unique(m1[,1:2])

您可以使用
dplyr
中的
intersect()
函数检查m2[,1:2]中的所有对是否出现在m1[,1:2]中:

library(dplyr)
dim(intersect(m2[,1:2],m1[1:2]))
[1] 9 2
dim(m2[,1:2])
[1] 9 2
此外,尝试检查变量是否被编码为因子。如果是这样,如果合并这些变量上的数据帧,可能会得到奇怪的结果。最好将它们转换为字符

至于合并数据帧的最佳方法,
merge
来自base R,以及
dplyr
internal\u join
数据的join。table
包在处理该任务时应该足够好。
data.table
可能是最快的


如果您只需要唯一的对,那么在进行合并之前应该运行
unique(m1[,1:2])

您可以使用
dplyr
中的
intersect()
函数检查m2[,1:2]中的所有对是否出现在m1[,1:2]中:

library(dplyr)
dim(intersect(m2[,1:2],m1[1:2]))
[1] 9 2
dim(m2[,1:2])
[1] 9 2
此外,尝试检查变量是否被编码为因子。如果是这样,如果合并这些变量上的数据帧,可能会得到奇怪的结果。最好将它们转换为字符

至于合并数据帧的最佳方法,
merge
来自base R,以及
dplyr
internal\u join
数据的join。table
包在处理该任务时应该足够好。
data.table
可能是最快的


如果您只需要唯一的对,那么在进行合并之前应该运行
unique(m1[,1:2])

您可以使用
dplyr
中的
intersect()
函数检查m2[,1:2]中的所有对是否出现在m1[,1:2]中:

library(dplyr)
dim(intersect(m2[,1:2],m1[1:2]))
[1] 9 2
dim(m2[,1:2])
[1] 9 2
此外,尝试检查变量是否被编码为因子。如果是这样,如果合并这些变量上的数据帧,可能会得到奇怪的结果。最好将它们转换为字符

至于合并数据帧的最佳方法,
merge
来自base R,以及
dplyr
internal\u join
数据的join。table
包在处理该任务时应该足够好。
data.table
可能是最快的


如果只需要唯一对,则应运行
unique(m1[,1:2])
在进行合并之前。

我认为这是一种更好的方法,可以推广到更大的集合中,尽管没有直接测试很难判断。我不确定您的
X1
X2
变量是什么,但这应该是可行的。合并结果的行数应该等于ro的行数这里是
m2
(较小的矩阵)的ws

我将您的第一行更改为
库(重塑2)
,它与代码的其余部分一起生成以下两个对象:

> m1
   Var1 Var2      value
1    A1   A1 0.50120206
2    A2   A1 0.07627305
3    A3   A1 0.73757589
4    A4   A1 0.24007736
5    A1   A2 0.93485899
6    A2   A2 0.67076761
7    A3   A2 0.92666447
8    A4   A2 0.79405152
9    A1   A3 0.33120170
10   A2   A3 0.48999764
11   A3   A3 0.86967692
12   A4   A3 0.01966199
13   A1   A4 0.03986184
14   A2   A4 0.50578328
15   A3   A4 0.30689141
16   A4   A4 0.54859405
> m2
  Var1 Var2      value
1   A1   A1 0.56995004
2   A2   A1 0.81317914
3   A3   A1 0.51047761
4   A1   A2 0.16949663
5   A2   A2 0.21790332
6   A3   A2 0.75785648
7   A1   A3 0.75591111
8   A2   A3 0.92541073
9   A3   A3 0.07877851
要合并这些,请使用来自dplyr包的联接操作,例如:

> final <- dplyr::full_join(m1, m2, by=c("Var1","Var2"))
Warning messages:
1: In outer_join_impl(x, y, by$x, by$y) :
  joining factors with different levels, coercing to character vector
2: In outer_join_impl(x, y, by$x, by$y) :
  joining factors with different levels, coercing to character vector

> final
   Var1 Var2    value.x    value.y
1    A1   A1 0.50120206 0.56995004
2    A2   A1 0.07627305 0.81317914
3    A3   A1 0.73757589 0.51047761
4    A4   A1 0.24007736         NA
5    A1   A2 0.93485899 0.16949663
6    A2   A2 0.67076761 0.21790332
7    A3   A2 0.92666447 0.75785648
8    A4   A2 0.79405152         NA
9    A1   A3 0.33120170 0.75591111
10   A2   A3 0.48999764 0.92541073
11   A3   A3 0.86967692 0.07877851
12   A4   A3 0.01966199         NA
13   A1   A4 0.03986184         NA
14   A2   A4 0.50578328         NA
15   A3   A4 0.30689141         NA
16   A4   A4 0.54859405         NA

我认为这是一种更好的方法,可以推广到更大的集合中,尽管没有直接的测试很难判断。我不确定您的
X1
X2
变量是什么,但这应该有效。合并结果的行数应该等于
m2
(较小的矩阵)这里

我将您的第一行更改为
库(重塑2)
,它与代码的其余部分一起生成以下两个对象:

> m1
   Var1 Var2      value
1    A1   A1 0.50120206
2    A2   A1 0.07627305
3    A3   A1 0.73757589
4    A4   A1 0.24007736
5    A1   A2 0.93485899
6    A2   A2 0.67076761
7    A3   A2 0.92666447
8    A4   A2 0.79405152
9    A1   A3 0.33120170
10   A2   A3 0.48999764
11   A3   A3 0.86967692
12   A4   A3 0.01966199
13   A1   A4 0.03986184
14   A2   A4 0.50578328
15   A3   A4 0.30689141
16   A4   A4 0.54859405
> m2
  Var1 Var2      value
1   A1   A1 0.56995004
2   A2   A1 0.81317914
3   A3   A1 0.51047761
4   A1   A2 0.16949663
5   A2   A2 0.21790332
6   A3   A2 0.75785648
7   A1   A3 0.75591111
8   A2   A3 0.92541073
9   A3   A3 0.07877851
要合并这些,请使用来自dplyr包的联接操作,例如:

> final <- dplyr::full_join(m1, m2, by=c("Var1","Var2"))
Warning messages:
1: In outer_join_impl(x, y, by$x, by$y) :
  joining factors with different levels, coercing to character vector
2: In outer_join_impl(x, y, by$x, by$y) :
  joining factors with different levels, coercing to character vector

> final
   Var1 Var2    value.x    value.y
1    A1   A1 0.50120206 0.56995004
2    A2   A1 0.07627305 0.81317914
3    A3   A1 0.73757589 0.51047761
4    A4   A1 0.24007736         NA
5    A1   A2 0.93485899 0.16949663
6    A2   A2 0.67076761 0.21790332
7    A3   A2 0.92666447 0.75785648
8    A4   A2 0.79405152         NA
9    A1   A3 0.33120170 0.75591111
10   A2   A3 0.48999764 0.92541073
11   A3   A3 0.86967692 0.07877851
12   A4   A3 0.01966199         NA
13   A1   A4 0.03986184         NA
14   A2   A4 0.50578328         NA
15   A3   A4 0.30689141         NA
16   A4   A4 0.54859405         NA

我认为这是一种更好的方法,可以推广到更大的集合中,尽管没有直接的测试很难判断。我不确定您的
X1
X2
变量是什么,但这应该有效。合并结果的行数应该等于
m2
(较小的矩阵)这里

我将您的第一行更改为
库(重塑2)
,它与代码的其余部分一起生成以下两个对象:

> m1
   Var1 Var2      value
1    A1   A1 0.50120206
2    A2   A1 0.07627305
3    A3   A1 0.73757589
4    A4   A1 0.24007736
5    A1   A2 0.93485899
6    A2   A2 0.67076761
7    A3   A2 0.92666447
8    A4   A2 0.79405152
9    A1   A3 0.33120170
10   A2   A3 0.48999764
11   A3   A3 0.86967692
12   A4   A3 0.01966199
13   A1   A4 0.03986184
14   A2   A4 0.50578328
15   A3   A4 0.30689141
16   A4   A4 0.54859405
> m2
  Var1 Var2      value
1   A1   A1 0.56995004
2   A2   A1 0.81317914
3   A3   A1 0.51047761
4   A1   A2 0.16949663
5   A2   A2 0.21790332
6   A3   A2 0.75785648
7   A1   A3 0.75591111
8   A2   A3 0.92541073
9   A3   A3 0.07877851
要合并这些,请使用来自dplyr包的联接操作,例如:

> final <- dplyr::full_join(m1, m2, by=c("Var1","Var2"))
Warning messages:
1: In outer_join_impl(x, y, by$x, by$y) :
  joining factors with different levels, coercing to character vector
2: In outer_join_impl(x, y, by$x, by$y) :
  joining factors with different levels, coercing to character vector

> final
   Var1 Var2    value.x    value.y
1    A1   A1 0.50120206 0.56995004
2    A2   A1 0.07627305 0.81317914
3    A3   A1 0.73757589 0.51047761
4    A4   A1 0.24007736         NA
5    A1   A2 0.93485899 0.16949663
6    A2   A2 0.67076761 0.21790332
7    A3   A2 0.92666447 0.75785648
8    A4   A2 0.79405152         NA
9    A1   A3 0.33120170 0.75591111
10   A2   A3 0.48999764 0.92541073
11   A3   A3 0.86967692 0.07877851
12   A4   A3 0.01966199         NA
13   A1   A4 0.03986184         NA
14   A2   A4 0.50578328         NA
15   A3   A4 0.30689141         NA
16   A4   A4 0.54859405         NA

我认为这是一种更好的方法,可以推广到更大的集合中,尽管没有直接的测试很难说。我不确定您的
X1
X2
变量是什么,但这应该有效。合并结果的行数应该等于
m2
的行数(较小的m