【问题标题】:Using rbind on two matrices to match rows在两个矩阵上使用 rbind 来匹配行
【发布时间】:2022-01-12 22:06:20
【问题描述】:

我有两个数据框,matrix A 和 matrix B,结构类似

matrix A
       [,1] [,2]  [,3]  [,4] 
 [1,]   121  114   117   200 
 [2,]   312  215    78   211
 [3,]   413  121   719   117
 
matrix B
       [,1] [,2]  [,3]  [,4] 
 [1,]   120  119   112   220 
 [2,]     0    7     1     2
 [3,]   412  111   713   113
 

我想创建一个新的数据框列表,每个子列表都是来自两个矩阵的匹配行值。例如,列表中的第一个新数据框将是

matrix C1
       [,1] [,2]  [,3]  [,4] 
 [1,]   121  114   117   200 
 [2,]   120  119   112   220

C1 中的第 1 行是矩阵 A 的第 1 行,这个新矩阵中的第 2 行是矩阵 B 的第 1 行。矩阵 C2 将是矩阵 A 和 B 的第 2 行,等等。

我知道我必须在某一时刻使用rbind(),但我迷失了如何获得我想要的输出?

【问题讨论】:

  • "C1 中的第 1 行是矩阵 A 中的第 1 行,这个新矩阵中的第 2 行是矩阵 B 中的第 1 行" - 看起来新矩阵中的第 2 行是第 2 行来自您的示例中的矩阵 B。
  • @thelatemail 哎呀,我的错。我编辑了帖子,所以现在是正确的

标签: r dataframe rbind


【解决方案1】:

您可以将它们放在一个数组中并使用aperm。

起始数据

matrixA <- matrix(runif(9,1,100),3)
matrixB <- matrix(runif(9,1,100),3)
list(matrixA, matrixB)    
#> [[1]]
#>           [,1]     [,2]     [,3]
#> [1,]  7.726875 88.77164 32.74513
#> [2,] 60.005675 26.94784 68.45881
#> [3,] 43.514952 94.43019 21.05740
#> 
#> [[2]]
#>          [,1]     [,2]      [,3]
#> [1,] 13.48753 65.43023 47.474468
#> [2,] 48.18658 25.19455 16.581541
#> [3,] 60.94665 58.46271  9.016365

创建一个数组和aperm

list(matrixA, matrixB) |>
  simplify2array() |>
  aperm()
#> , , 1
#> 
#>           [,1]     [,2]     [,3]
#> [1,]  7.726875 88.77164 32.74513
#> [2,] 13.487534 65.43023 47.47447
#> 
#> , , 2
#> 
#>          [,1]     [,2]     [,3]
#> [1,] 60.00567 26.94784 68.45881
#> [2,] 48.18658 25.19455 16.58154
#> 
#> , , 3
#> 
#>          [,1]     [,2]      [,3]
#> [1,] 43.51495 94.43019 21.057402
#> [2,] 60.94665 58.46271  9.016365

由reprex package 创建于 2021-12-07 (v2.0.1)

【讨论】:

  • 如何为每个列表添加第三行,以获取每列的最大值?
  • 在aperm()之后添加到|&gt;链的末尾:|&gt; apply(3, \(x) rbind(x, apply(x, 2, max)), simplify = FALSE)
【解决方案2】:

与BaseR,

lapply(1:nrow(matrixA), function(x) rbind(matrixA[x,],matrixB[x,]))

给予,

[[1]]
         [,1]     [,2]     [,3]
[1,] 52.81736 68.83760 92.26946
[2,] 49.17765 59.02276 15.89793

[[2]]
         [,1]     [,2]     [,3]
[1,] 48.21500 35.82741 11.52465
[2,] 33.05838 23.17105 70.05778

[[3]]
         [,1]     [,2]     [,3]
[1,] 52.93969 84.12350 21.44636
[2,] 47.69968 73.66894 27.14668

虚假数据:

    matrixA <- matrix(runif(9,1,100),3)
    matrixB <- matrix(runif(9,1,100),3)

【讨论】:

  • 如何为每个列表添加第三行,以获取每列的最大值?
【解决方案3】:

这是一个使用行索引的例子:

# matrix1
M1 <- matrix(c(3:14), nrow = 4, byrow = TRUE)

# matrix2
M2 <- matrix(c(13:24), nrow = 4, byrow = TRUE)

M3 <- rbind(M1[1,], M2[2,])
M3
     [,1] [,2] [,3]
[1,]    3    4    5
[2,]   16   17   18

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 2021-11-17
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多