如何在 R 中逐行比较两个不同的矩阵?
How to compare row-wise two different matrices exhaustively in R?
我有两个矩阵(mat1 和 mat2),它们的列数相同(各四列)但行数不同(一个矩阵有三个,另一个矩阵有五个)。我想将一个矩阵中的每一行与另一个矩阵中的每一行进行比较。两个矩阵中的值和行中的位置应该相同。
我一直在尝试“应用”功能,但在定义该功能时遇到问题:apply(mat2,1,function(x){mat1[x,]==mat2 [x,]}
和其他类似组合导致消息“下标越界”。
我是这个世界的新手(R 和编程),在网上有搜索信息,但我什么也没找到。我真的卡住了。
非常感谢你的帮助。
提前致谢。
鲤鱼
> mat1
[,1] [,2] [,3] [,4]
[1,] 2 44 3 9
[2,] 13 56 13 13
[3,] 4 9 14 33
> mat2
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
>
The output that I am looking for is:
> [1,]
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE FALSE
[5,] FALSE FALSE FALSE FALSE
> [2,]
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE
[3,] FALSE FALSE TRUE FALSE
[4,] FALSE FALSE FALSE FALSE
[5,] FALSE FALSE FALSE FALSE
> [3,]
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE
[4,] TRUE TRUE TRUE FALSE
[5,] FALSE FALSE FALSE FALSE
1.申请
array(apply(mat1, 1, function(x) t(x == t(mat2))), dim = c(dim(mat2), nrow(mat1)))
2。轻拍
tapply(mat1, row(mat1), function(x) t(x == t(mat2)))
3. lapply
lapply(split(mat1, row(mat1)), function(x) t(x == t(mat2)))
输出
$`1`
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE FALSE
[5,] FALSE FALSE FALSE FALSE
$`2`
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE
[3,] FALSE FALSE TRUE FALSE
[4,] FALSE FALSE FALSE FALSE
[5,] FALSE FALSE FALSE FALSE
$`3`
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE
[4,] TRUE TRUE TRUE FALSE
[5,] FALSE FALSE FALSE FALSE
我有两个矩阵(mat1 和 mat2),它们的列数相同(各四列)但行数不同(一个矩阵有三个,另一个矩阵有五个)。我想将一个矩阵中的每一行与另一个矩阵中的每一行进行比较。两个矩阵中的值和行中的位置应该相同。
我一直在尝试“应用”功能,但在定义该功能时遇到问题:apply(mat2,1,function(x){mat1[x,]==mat2 [x,]}
和其他类似组合导致消息“下标越界”。
我是这个世界的新手(R 和编程),在网上有搜索信息,但我什么也没找到。我真的卡住了。
非常感谢你的帮助。
提前致谢。
鲤鱼
> mat1
[,1] [,2] [,3] [,4]
[1,] 2 44 3 9
[2,] 13 56 13 13
[3,] 4 9 14 33
> mat2
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
>
The output that I am looking for is:
> [1,]
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE FALSE
[5,] FALSE FALSE FALSE FALSE
> [2,]
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE
[3,] FALSE FALSE TRUE FALSE
[4,] FALSE FALSE FALSE FALSE
[5,] FALSE FALSE FALSE FALSE
> [3,]
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE
[4,] TRUE TRUE TRUE FALSE
[5,] FALSE FALSE FALSE FALSE
1.申请
array(apply(mat1, 1, function(x) t(x == t(mat2))), dim = c(dim(mat2), nrow(mat1)))
2。轻拍
tapply(mat1, row(mat1), function(x) t(x == t(mat2)))
3. lapply
lapply(split(mat1, row(mat1)), function(x) t(x == t(mat2)))
输出
$`1`
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE FALSE
[5,] FALSE FALSE FALSE FALSE
$`2`
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE
[3,] FALSE FALSE TRUE FALSE
[4,] FALSE FALSE FALSE FALSE
[5,] FALSE FALSE FALSE FALSE
$`3`
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE
[4,] TRUE TRUE TRUE FALSE
[5,] FALSE FALSE FALSE FALSE