矢量化矩阵

时间:2010-12-31 14:13:23

标签: r vector statistics matrix

我有一个1000 x 1000的大型2D矩阵。我想重塑它,使它成为一列(或行)。例如,如果矩阵是:

A B C
1 4 7
2 5 8
3 6 9

我想把它变成:

  

1 2 3 4 5 6 7 8 9

我不需要保留列标题,只需保留数据的顺序。我如何使用reshape2(我认为最容易使用的包)这样做?


为了澄清,我提到reshape因为我认为这是最好的方法。我可以看到有更简单的方法让我非常满意。

5 个答案:

答案 0 :(得分:47)

我认为找到比以下更紧凑的方法很难:

c(m)
[1] 1 2 3 4 5 6 7 8 9

但是,如果你想保留一个矩阵结构,那么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

获得尺寸乘积会有更紧凑的方法,但上述方法强调dim属性是矩阵的双元素向量。在该示例中获得“9”的其他方式包括:

> prod(dim(m))
[1] 9
> length(m)
[1] 9

答案 1 :(得分: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

答案 2 :(得分:10)

来吧R伙伴们,让我们给OP一个reshape2解决方案:

> m <- matrix(c(1:9), ncol = 3)
> melt(m)$value
[1] 1 2 3 4 5 6 7 8 9

我只是不愿意测试它比c(m)慢多少。但它是一样的:

> identical(c(m),melt(m)$value)
[1] TRUE

[编辑:哎呀,我在开玩笑吧:]

> 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 

答案 3 :(得分:3)

as.vector(m)应该比c(m)更有效:

> library(rbenchmark)
> m <- diag(5000)
> benchmark(
+   vect = as.vector(m), 
+   conc = c(m), 
+   replications=100
+ )
  test replications elapsed relative user.self sys.self user.child sys.child
2 conc          100  12.699    1.177     6.952    5.754          0         0
1 vect          100  10.785    1.000     4.858    5.933          0         0

答案 4 :(得分:0)

使用函数&#34; sapply&#34;这是一种更简单的方法。 (或者也可以使用&#39; for&#39;循环)

 m <- matrix(c(1:9), ncol = 3)
 (m1 <- as.numeric(sapply(1:NROW(m), function(i)(m[,i]))))