Matrix.utils merge.Matrix并合并不同的结果

发布于 2025-01-11 18:54:46 字数 5068 浏览 0 评论 0原文

我对 R 包 Matrix.utils 及其 merge.Matrix() 实现感到非常困惑。我想合并两个具有 0 个公共值的矩阵,但合并公共列名称并用零填充其余部分。

结果不一致,并且对指定 merge() 还是 merge.Matrix() 很敏感。我预计这与 dplyr::join() 函数类似,但事实并非如此。

模拟我计划使用的数据:

mtx.x <- sample(1:100, 100) ; mtx.x <- matrix(mtx.x, nrow = 10)
mtx.y <- sample(1:100, 100) ; mtx.y <- matrix(mtx.y, nrow = 10)
 
colnames(mtx.x) <- letters[1:10] ; colnames(mtx.y) <- letters[6:15]

mtx.x ; mtx.y

       a  b  c  d  e  f  g  h  i  j
 [1,]  82 61 76 36 27 67 85 38 29 87
 [2,]  83 89 43 70 81 30 35 17 39 95
 [3,]   1 75 69 54 66  3 10 47 93 73
 [4,]  52 98 26 88 51 64 31 72 13 92
 [5,]  44 74 86  9 63 58 50 56  6 49
 [6,]  24 16 77 12 55 97 18 45 14 40
 [7,]  11  5 79 94  2 80 37 15 41 42
 [8,] 100 84 65 59 34 62 53 60 99 28
 [9,]  19 78  8 25 96 21 90 46 68 71
[10,]  32 20  7  4 57 91 22 48 33 23
       f  g  h  i  j   k  l  m  n  o
 [1,] 24 22  8 94 89   7 50 93 40  4
 [2,] 63 80 32 44 64  83 16 96 46 47
 [3,] 85 30 81 95 23  91 19 92 99 52
 [4,] 21 55 61 58 27  76 67 65 37 14
 [5,]  9 66 12  2 41  11 56 84 87 39
 [6,] 18 57 88  3 68 100 74 62 82 25
 [7,] 70 90 43 54 72  86 69 20 29 51
 [8,]  1 59 60 45 79  75 15  5 73 10
 [9,] 38 28 26 17 53  36 97 13 77 49
[10,]  6 71 98 35 42  31 78 33 48 34

情况 1:将 merge()all.x/all.y 设置为 TRUE< /code> 做我想要的情况

merge(x = mtx.x, y = mtx.y, 
      all.x = T, all.y = T) 

    f  g  h  i  j   a  b  c  d  e   k  l  m  n  o
1   1 59 60 45 79  NA NA NA NA NA  75 15  5 73 10
2   3 10 47 93 73   1 75 69 54 66  NA NA NA NA NA
3   6 71 98 35 42  NA NA NA NA NA  31 78 33 48 34
4   9 66 12  2 41  NA NA NA NA NA  11 56 84 87 39
5  18 57 88  3 68  NA NA NA NA NA 100 74 62 82 25
6  21 55 61 58 27  NA NA NA NA NA  76 67 65 37 14
7  21 90 46 68 71  19 78  8 25 96  NA NA NA NA NA
8  24 22  8 94 89  NA NA NA NA NA   7 50 93 40  4
9  30 35 17 39 95  83 89 43 70 81  NA NA NA NA NA
10 38 28 26 17 53  NA NA NA NA NA  36 97 13 77 49
11 58 50 56  6 49  44 74 86  9 63  NA NA NA NA NA
12 62 53 60 99 28 100 84 65 59 34  NA NA NA NA NA
13 63 80 32 44 64  NA NA NA NA NA  83 16 96 46 47
14 64 31 72 13 92  52 98 26 88 51  NA NA NA NA NA
15 67 85 38 29 87  82 61 76 36 27  NA NA NA NA NA
16 70 90 43 54 72  NA NA NA NA NA  86 69 20 29 51
17 80 37 15 41 42  11  5 79 94  2  NA NA NA NA NA
18 85 30 81 95 23  NA NA NA NA NA  91 19 92 99 52
19 91 22 48 33 23  32 20  7  4 57  NA NA NA NA NA
20 97 18 45 14 40  24 16 77 12 55  NA NA NA NA NA

案例 2:具有相同参数的 merge.Matrix() 希望我指定 by.x/by.y

merge.Matrix(x = mtx.x, y = mtx.y, 
             all.x = T, all.y = T)
Error in grr::matches(by.x, by.y, all.x, all.y, nomatch = NULL) : 
  argument "by.x" is missing, with no default

情况3:指定by.x/by.y 作为各自的列名称不会合并公共列。另外,不知道为什么将矩阵偏移 5 而不是 10,这些矩阵没有共同值。

merge.Matrix(x = mtx.x, y = mtx.y, 
             all.x = T, all.y = T,
             by.x = colnames(mtx.x), by.y = colnames(mtx.y))

         a  b  c  d  e  f  g  h  i  j y.f y.g y.h y.i y.j   k  l  m  n  o
        82 61 76 36 27 67 85 38 29 87  NA  NA  NA  NA  NA  NA NA NA NA NA
        83 89 43 70 81 30 35 17 39 95  NA  NA  NA  NA  NA  NA NA NA NA NA
         1 75 69 54 66  3 10 47 93 73  NA  NA  NA  NA  NA  NA NA NA NA NA
        52 98 26 88 51 64 31 72 13 92  NA  NA  NA  NA  NA  NA NA NA NA NA
        44 74 86  9 63 58 50 56  6 49  NA  NA  NA  NA  NA  NA NA NA NA NA
        24 16 77 12 55 97 18 45 14 40  24  22   8  94  89   7 50 93 40  4
        11  5 79 94  2 80 37 15 41 42  63  80  32  44  64  83 16 96 46 47
       100 84 65 59 34 62 53 60 99 28  85  30  81  95  23  91 19 92 99 52
        19 78  8 25 96 21 90 46 68 71  21  55  61  58  27  76 67 65 37 14
        32 20  7  4 57 91 22 48 33 23   9  66  12   2  41  11 56 84 87 39
fill.x  NA NA NA NA NA NA NA NA NA NA  18  57  88   3  68 100 74 62 82 25
fill.x  NA NA NA NA NA NA NA NA NA NA  70  90  43  54  72  86 69 20 29 51
fill.x  NA NA NA NA NA NA NA NA NA NA   1  59  60  45  79  75 15  5 73 10
fill.x  NA NA NA NA NA NA NA NA NA NA  38  28  26  17  53  36 97 13 77 49
fill.x  NA NA NA NA NA NA NA NA NA NA   6  71  98  35  42  31 78 33 48 34

情况 4:by.x/by.y 指定为公共列名称,all.x/all.y 设置为 TRUE 并将 fill.x/fill.y 设置为 0 不会执行文档声称的完全连接

common <- intersect(colnames(mtx.x), colnames(mtx.y))
merge.Matrix(x = mtx.x, y = mtx.y, 
             all.x = T, all.y = T,
             by.x = common, by.y = common)
  a  b  c  d  e  f  g  h  i  j y.f y.g y.h y.i y.j  k  l  m  n  o
 82 61 76 36 27 67 85 38 29 87  24  22   8  94  89  7 50 93 40  4
 83 89 43 70 81 30 35 17 39 95  63  80  32  44  64 83 16 96 46 47
  1 75 69 54 66  3 10 47 93 73  85  30  81  95  23 91 19 92 99 52
 52 98 26 88 51 64 31 72 13 92  21  55  61  58  27 76 67 65 37 14
 44 74 86  9 63 58 50 56  6 49   9  66  12   2  41 11 56 84 87 39

I am very confused by the R package Matrix.utils and its implementation of merge.Matrix(). I want to merge two matrices with 0 common values, but merge common column names and fill the rest with zeros.

The results are inconsistent and sensitive to whether merge() or merge.Matrix() is specified. I expected this to be similar to the dplyr::join() function but this is not true.

Simulating the data I plan to use:

mtx.x <- sample(1:100, 100) ; mtx.x <- matrix(mtx.x, nrow = 10)
mtx.y <- sample(1:100, 100) ; mtx.y <- matrix(mtx.y, nrow = 10)
 
colnames(mtx.x) <- letters[1:10] ; colnames(mtx.y) <- letters[6:15]

mtx.x ; mtx.y

       a  b  c  d  e  f  g  h  i  j
 [1,]  82 61 76 36 27 67 85 38 29 87
 [2,]  83 89 43 70 81 30 35 17 39 95
 [3,]   1 75 69 54 66  3 10 47 93 73
 [4,]  52 98 26 88 51 64 31 72 13 92
 [5,]  44 74 86  9 63 58 50 56  6 49
 [6,]  24 16 77 12 55 97 18 45 14 40
 [7,]  11  5 79 94  2 80 37 15 41 42
 [8,] 100 84 65 59 34 62 53 60 99 28
 [9,]  19 78  8 25 96 21 90 46 68 71
[10,]  32 20  7  4 57 91 22 48 33 23
       f  g  h  i  j   k  l  m  n  o
 [1,] 24 22  8 94 89   7 50 93 40  4
 [2,] 63 80 32 44 64  83 16 96 46 47
 [3,] 85 30 81 95 23  91 19 92 99 52
 [4,] 21 55 61 58 27  76 67 65 37 14
 [5,]  9 66 12  2 41  11 56 84 87 39
 [6,] 18 57 88  3 68 100 74 62 82 25
 [7,] 70 90 43 54 72  86 69 20 29 51
 [8,]  1 59 60 45 79  75 15  5 73 10
 [9,] 38 28 26 17 53  36 97 13 77 49
[10,]  6 71 98 35 42  31 78 33 48 34

Case 1: merge() with all.x/all.y set to TRUE does what I want

merge(x = mtx.x, y = mtx.y, 
      all.x = T, all.y = T) 

    f  g  h  i  j   a  b  c  d  e   k  l  m  n  o
1   1 59 60 45 79  NA NA NA NA NA  75 15  5 73 10
2   3 10 47 93 73   1 75 69 54 66  NA NA NA NA NA
3   6 71 98 35 42  NA NA NA NA NA  31 78 33 48 34
4   9 66 12  2 41  NA NA NA NA NA  11 56 84 87 39
5  18 57 88  3 68  NA NA NA NA NA 100 74 62 82 25
6  21 55 61 58 27  NA NA NA NA NA  76 67 65 37 14
7  21 90 46 68 71  19 78  8 25 96  NA NA NA NA NA
8  24 22  8 94 89  NA NA NA NA NA   7 50 93 40  4
9  30 35 17 39 95  83 89 43 70 81  NA NA NA NA NA
10 38 28 26 17 53  NA NA NA NA NA  36 97 13 77 49
11 58 50 56  6 49  44 74 86  9 63  NA NA NA NA NA
12 62 53 60 99 28 100 84 65 59 34  NA NA NA NA NA
13 63 80 32 44 64  NA NA NA NA NA  83 16 96 46 47
14 64 31 72 13 92  52 98 26 88 51  NA NA NA NA NA
15 67 85 38 29 87  82 61 76 36 27  NA NA NA NA NA
16 70 90 43 54 72  NA NA NA NA NA  86 69 20 29 51
17 80 37 15 41 42  11  5 79 94  2  NA NA NA NA NA
18 85 30 81 95 23  NA NA NA NA NA  91 19 92 99 52
19 91 22 48 33 23  32 20  7  4 57  NA NA NA NA NA
20 97 18 45 14 40  24 16 77 12 55  NA NA NA NA NA

Case 2: merge.Matrix() with same arguments wants me to specify by.x/by.y

merge.Matrix(x = mtx.x, y = mtx.y, 
             all.x = T, all.y = T)
Error in grr::matches(by.x, by.y, all.x, all.y, nomatch = NULL) : 
  argument "by.x" is missing, with no default

Case 3: specifying by.x/by.y as respective column names does not merge common columns. also, no idea why its offsetting the matrices by 5 and not 10, the matrices have no common values.

merge.Matrix(x = mtx.x, y = mtx.y, 
             all.x = T, all.y = T,
             by.x = colnames(mtx.x), by.y = colnames(mtx.y))

         a  b  c  d  e  f  g  h  i  j y.f y.g y.h y.i y.j   k  l  m  n  o
        82 61 76 36 27 67 85 38 29 87  NA  NA  NA  NA  NA  NA NA NA NA NA
        83 89 43 70 81 30 35 17 39 95  NA  NA  NA  NA  NA  NA NA NA NA NA
         1 75 69 54 66  3 10 47 93 73  NA  NA  NA  NA  NA  NA NA NA NA NA
        52 98 26 88 51 64 31 72 13 92  NA  NA  NA  NA  NA  NA NA NA NA NA
        44 74 86  9 63 58 50 56  6 49  NA  NA  NA  NA  NA  NA NA NA NA NA
        24 16 77 12 55 97 18 45 14 40  24  22   8  94  89   7 50 93 40  4
        11  5 79 94  2 80 37 15 41 42  63  80  32  44  64  83 16 96 46 47
       100 84 65 59 34 62 53 60 99 28  85  30  81  95  23  91 19 92 99 52
        19 78  8 25 96 21 90 46 68 71  21  55  61  58  27  76 67 65 37 14
        32 20  7  4 57 91 22 48 33 23   9  66  12   2  41  11 56 84 87 39
fill.x  NA NA NA NA NA NA NA NA NA NA  18  57  88   3  68 100 74 62 82 25
fill.x  NA NA NA NA NA NA NA NA NA NA  70  90  43  54  72  86 69 20 29 51
fill.x  NA NA NA NA NA NA NA NA NA NA   1  59  60  45  79  75 15  5 73 10
fill.x  NA NA NA NA NA NA NA NA NA NA  38  28  26  17  53  36 97 13 77 49
fill.x  NA NA NA NA NA NA NA NA NA NA   6  71  98  35  42  31 78 33 48 34

Case 4: by.x/by.y specified as common column names, all.x/all.y set to TRUE and fill.x/fill.y set to 0 does not do a full join as the documentation claims

common <- intersect(colnames(mtx.x), colnames(mtx.y))
merge.Matrix(x = mtx.x, y = mtx.y, 
             all.x = T, all.y = T,
             by.x = common, by.y = common)
  a  b  c  d  e  f  g  h  i  j y.f y.g y.h y.i y.j  k  l  m  n  o
 82 61 76 36 27 67 85 38 29 87  24  22   8  94  89  7 50 93 40  4
 83 89 43 70 81 30 35 17 39 95  63  80  32  44  64 83 16 96 46 47
  1 75 69 54 66  3 10 47 93 73  85  30  81  95  23 91 19 92 99 52
 52 98 26 88 51 64 31 72 13 92  21  55  61  58  27 76 67 65 37 14
 44 74 86  9 63 58 50 56  6 49   9  66  12   2  41 11 56 84 87 39

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文