R 合并两个不同大小的矩阵
我有两个对称的相关矩阵,其中一个表示另一个的子集。我想把两个矩阵合并成长格式,以便以后在x,y图中使用。这里有一个小例子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
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