djq*_*djq 36 statistics r vector matrix
我有一个1000 x 1000的大型2D矩阵.我想重塑它,使它成为一列(或行).例如,如果矩阵是:
A B C
1 4 7
2 5 8
3 6 9
Run Code Online (Sandbox Code Playgroud)
我想把它变成:
1 2 3 4 5 6 7 8 9
我不需要保留列标题,只需保留数据的顺序.我如何使用reshape2
(这是我认为最容易使用的包)?
只是为了澄清,我提到reshape
我认为这是最好的方法.我可以看到有更简单的方法让我非常满意.
42-*_*42- 49
我认为找到一个比以下更紧凑的方法是困难的:
c(m)
[1] 1 2 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)
但是,如果要保留矩阵结构,则重新处理dim属性将是有效的:
dim(m) <- c(dim(m)[1]*dim(m)[2], 1)
m
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
[5,] 5
[6,] 6
[7,] 7
[8,] 8
[9,] 9
Run Code Online (Sandbox Code Playgroud)
获得维度的乘积会有更紧凑的方法,但上述方法强调dim属性是矩阵的两元素向量.在该示例中获得"9"的其他方式包括:
> prod(dim(m))
[1] 9
> length(m)
[1] 9
Run Code Online (Sandbox Code Playgroud)
EDi*_*EDi 13
一种可能的解决方案,但不使用reshape2:
> m <- matrix(c(1:9), ncol = 3)
> m
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> as.vector(m)
[1] 1 2 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)
Spa*_*man 10
来吧R伙伴们,让我们给OP一个reshape2解决方案:
> m <- matrix(c(1:9), ncol = 3)
> melt(m)$value
[1] 1 2 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)
我只是不愿意测试它比c(m)慢多少.但它是一样的:
> identical(c(m),melt(m)$value)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
[编辑:哎呀,我在开玩笑吧:]
> system.time(for(i in 1:1000){z=melt(m)$value})
user system elapsed
1.653 0.004 1.662
> system.time(for(i in 1:1000){z=c(m)})
user system elapsed
0.004 0.000 0.004
Run Code Online (Sandbox Code Playgroud)