如何在没有 for 循环的情况下重塑基 R 中的矩阵?
How can I reshape a matrix in base R without a for loop?
我有一些数据具有以下维度
[100, 2, 100]。它代表 100 行观察值,2 列变量,在 100 次实验中重复。
我想将数据放在维度为 [10000, 2] 的矩阵中,我已经有效地消除了实验的概念。
python 中的 .reshape 之类的东西。
我找到了重塑包。但是我想知道没有它是否可以完成。
在 base R 中有比 for 循环更优雅的方法吗?
您可以简单地设置 dim
属性。
让我们以 3 x 2 x 3 数组为例:
example <- array(1:18, c(3, 2, 3))
example
#> , , 1
#>
#> [,1] [,2]
#> [1,] 1 4
#> [2,] 2 5
#> [3,] 3 6
#>
#> , , 2
#>
#> [,1] [,2]
#> [1,] 7 10
#> [2,] 8 11
#> [3,] 9 12
#>
#> , , 3
#>
#> [,1] [,2]
#> [1,] 13 16
#> [2,] 14 17
#> [3,] 15 18
要进入 2 列,我们可以这样做:
dim(example) <- c(9, 2)
example
#> [,1] [,2]
#> [1,] 1 10
#> [2,] 2 11
#> [3,] 3 12
#> [4,] 4 13
#> [5,] 5 14
#> [6,] 6 15
#> [7,] 7 16
#> [8,] 8 17
#> [9,] 9 18
由 reprex package (v2.0.1)
创建于 2022-04-02
让我们从一个较小的数组示例开始 m
m <- array(rep(1:100, 5), c(10, 2, 5))
这是一个 3 维数组
> m
, , 1
[,1] [,2]
[1,] 1 11
[2,] 2 12
[3,] 3 13
[4,] 4 14
[5,] 5 15
[6,] 6 16
[7,] 7 17
[8,] 8 18
[9,] 9 19
[10,] 10 20
, , 2
[,1] [,2]
[1,] 21 31
[2,] 22 32
[3,] 23 33
[4,] 24 34
[5,] 25 35
[6,] 26 36
[7,] 27 37
[8,] 28 38
[9,] 29 39
[10,] 30 40
, , 3
[,1] [,2]
[1,] 41 51
[2,] 42 52
[3,] 43 53
[4,] 44 54
[5,] 45 55
[6,] 46 56
[7,] 47 57
[8,] 48 58
[9,] 49 59
[10,] 50 60
, , 4
[,1] [,2]
[1,] 61 71
[2,] 62 72
[3,] 63 73
[4,] 64 74
[5,] 65 75
[6,] 66 76
[7,] 67 77
[8,] 68 78
[9,] 69 79
[10,] 70 80
, , 5
[,1] [,2]
[1,] 81 91
[2,] 82 92
[3,] 83 93
[4,] 84 94
[5,] 85 95
[6,] 86 96
[7,] 87 97
[8,] 88 98
[9,] 89 99
[10,] 90 100
如果你想把它重塑成50x2
数组,我们可以试试
> apply(m, 2, `[`)
[,1] [,2]
[1,] 1 11
[2,] 2 12
[3,] 3 13
[4,] 4 14
[5,] 5 15
[6,] 6 16
[7,] 7 17
[8,] 8 18
[9,] 9 19
[10,] 10 20
[11,] 21 31
[12,] 22 32
[13,] 23 33
[14,] 24 34
[15,] 25 35
[16,] 26 36
[17,] 27 37
[18,] 28 38
[19,] 29 39
[20,] 30 40
[21,] 41 51
[22,] 42 52
[23,] 43 53
[24,] 44 54
[25,] 45 55
[26,] 46 56
[27,] 47 57
[28,] 48 58
[29,] 49 59
[30,] 50 60
[31,] 61 71
[32,] 62 72
[33,] 63 73
[34,] 64 74
[35,] 65 75
[36,] 66 76
[37,] 67 77
[38,] 68 78
[39,] 69 79
[40,] 70 80
[41,] 81 91
[42,] 82 92
[43,] 83 93
[44,] 84 94
[45,] 85 95
[46,] 86 96
[47,] 87 97
[48,] 88 98
[49,] 89 99
[50,] 90 100
我有一些数据具有以下维度 [100, 2, 100]。它代表 100 行观察值,2 列变量,在 100 次实验中重复。
我想将数据放在维度为 [10000, 2] 的矩阵中,我已经有效地消除了实验的概念。
python 中的 .reshape 之类的东西。
我找到了重塑包。但是我想知道没有它是否可以完成。 在 base R 中有比 for 循环更优雅的方法吗?
您可以简单地设置 dim
属性。
让我们以 3 x 2 x 3 数组为例:
example <- array(1:18, c(3, 2, 3))
example
#> , , 1
#>
#> [,1] [,2]
#> [1,] 1 4
#> [2,] 2 5
#> [3,] 3 6
#>
#> , , 2
#>
#> [,1] [,2]
#> [1,] 7 10
#> [2,] 8 11
#> [3,] 9 12
#>
#> , , 3
#>
#> [,1] [,2]
#> [1,] 13 16
#> [2,] 14 17
#> [3,] 15 18
要进入 2 列,我们可以这样做:
dim(example) <- c(9, 2)
example
#> [,1] [,2]
#> [1,] 1 10
#> [2,] 2 11
#> [3,] 3 12
#> [4,] 4 13
#> [5,] 5 14
#> [6,] 6 15
#> [7,] 7 16
#> [8,] 8 17
#> [9,] 9 18
由 reprex package (v2.0.1)
创建于 2022-04-02让我们从一个较小的数组示例开始 m
m <- array(rep(1:100, 5), c(10, 2, 5))
这是一个 3 维数组
> m
, , 1
[,1] [,2]
[1,] 1 11
[2,] 2 12
[3,] 3 13
[4,] 4 14
[5,] 5 15
[6,] 6 16
[7,] 7 17
[8,] 8 18
[9,] 9 19
[10,] 10 20
, , 2
[,1] [,2]
[1,] 21 31
[2,] 22 32
[3,] 23 33
[4,] 24 34
[5,] 25 35
[6,] 26 36
[7,] 27 37
[8,] 28 38
[9,] 29 39
[10,] 30 40
, , 3
[,1] [,2]
[1,] 41 51
[2,] 42 52
[3,] 43 53
[4,] 44 54
[5,] 45 55
[6,] 46 56
[7,] 47 57
[8,] 48 58
[9,] 49 59
[10,] 50 60
, , 4
[,1] [,2]
[1,] 61 71
[2,] 62 72
[3,] 63 73
[4,] 64 74
[5,] 65 75
[6,] 66 76
[7,] 67 77
[8,] 68 78
[9,] 69 79
[10,] 70 80
, , 5
[,1] [,2]
[1,] 81 91
[2,] 82 92
[3,] 83 93
[4,] 84 94
[5,] 85 95
[6,] 86 96
[7,] 87 97
[8,] 88 98
[9,] 89 99
[10,] 90 100
如果你想把它重塑成50x2
数组,我们可以试试
> apply(m, 2, `[`)
[,1] [,2]
[1,] 1 11
[2,] 2 12
[3,] 3 13
[4,] 4 14
[5,] 5 15
[6,] 6 16
[7,] 7 17
[8,] 8 18
[9,] 9 19
[10,] 10 20
[11,] 21 31
[12,] 22 32
[13,] 23 33
[14,] 24 34
[15,] 25 35
[16,] 26 36
[17,] 27 37
[18,] 28 38
[19,] 29 39
[20,] 30 40
[21,] 41 51
[22,] 42 52
[23,] 43 53
[24,] 44 54
[25,] 45 55
[26,] 46 56
[27,] 47 57
[28,] 48 58
[29,] 49 59
[30,] 50 60
[31,] 61 71
[32,] 62 72
[33,] 63 73
[34,] 64 74
[35,] 65 75
[36,] 66 76
[37,] 67 77
[38,] 68 78
[39,] 69 79
[40,] 70 80
[41,] 81 91
[42,] 82 92
[43,] 83 93
[44,] 84 94
[45,] 85 95
[46,] 86 96
[47,] 87 97
[48,] 88 98
[49,] 89 99
[50,] 90 100