我有一个包含许多列的矩阵。我想将每一列都转换为较小的矩阵,并将其附加以创建新的矩阵
下面是给定的数据
A1 B1 C1
1 9 17
2 10 18
3 11 19
4 12 20
5 13 21
6 14 22
7 15 23
8 16 24
应更改为
1 5
2 6
3 7
4 8
9 13
10 14
11 15
12 16
17 21
18 22
19 23
20 24
我举了一个小例子。但是我的数据中确实有大量的列。我想知道如何通过编写一个函数/循环来实现这一点
答案 0 :(得分:2)
您可以cbind
顶行和底行:
> cbind(c(x[1 : (nrow(x)/2), ]), c(x[(nrow(x)/2 + 1) : nrow(x), ]))
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
[5,] 9 13
[6,] 10 14
[7,] 11 15
[8,] 12 16
[9,] 17 21
[10,] 18 22
[11,] 19 23
[12,] 20 24
,其中x
是输入矩阵。
答案 1 :(得分:1)
在遍历该列之后,将该列转换为具有n行(即4行2列)的matrix
,rbind
list
元素以创建{{1} }
matrix
请注意,如果输入为矩阵,则可以使用# if the input is data.frame
do.call(rbind, lapply(df1, matrix, ncol=2, nrow = 4))
# [,1] [,2]
# [1,] 1 5
# [2,] 2 6
# [3,] 3 7
# [4,] 4 8
# [5,] 9 13
# [6,] 10 14
# [7,] 11 15
# [8,] 12 16
# [9,] 17 21
#[10,] 18 22
#[11,] 19 23
#[12,] 20 24
(对于data.frame
)将其转换为as.data.frame
lapply
df1 <- as.data.frame(df1)
遍历数据集的列并返回lapply
个list
vector
通过调用lapply(df1, I)
#$A1
#[1] 1 2 3 4 5 6 7 8
#$B1
#[1] 9 10 11 12 13 14 15 16
#$C1
#[1] 17 18 19 20 21 22 23 24
并指定行数(vector
,将这些matrix
更改为dim
(矩阵是具有matrix
属性的向量) }),列数(nrow
)
ncol
现在,我们有了lapply(df1, matrix, nrow = 4, ncol = 2)
#$A1
# [,1] [,2]
#[1,] 1 5
#[2,] 2 6
#[3,] 3 7
#[4,] 4 8
#$B1
# [,1] [,2]
#[1,] 9 13
#[2,] 10 14
#[3,] 11 15
#[4,] 12 16
#$C1
# [,1] [,2]
#[1,] 17 21
#[2,] 18 22
#[3,] 19 23
#[4,] 20 24
个矩阵,然后将它们与list
绑定在一起(行绑定)以创建单个rbind
用matrix
包裹(如果需要data.frame)
as.data.frame
如果输入是矩阵
as.data.frame(do.call(rbind, lapply(df1, matrix, ncol=2, nrow = 4)))
注意:当行和列更多时,这会更普遍