在R/Splus中将两列变成一列的更好方法是什么?

low*_*rul 2 r matrix

目前我做以下事情:

x <- cbind(c(1, 2, 3), c(4, 5, 6))
x.merged <- matrix(t(x), ncol=1)
Run Code Online (Sandbox Code Playgroud)

使用1, 4, 2, 5, 3, 6,矩阵中的值创建一个列x.但依靠t(x)似乎有点笨重.有一个更好的方法吗?我想避免使用for循环,或者apply是否有一个更简单的内置函数来处理这类事情.

编辑:更清楚,x只是给了我.上面的第一行代码仅用于说明所涉及的值.我可能写得更好:

> x
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
Run Code Online (Sandbox Code Playgroud)

Jor*_*eys 7

实际上,如果你把它作为一个矢量,它不需要超过:

> c(t(x))
[1] 1 4 2 5 3 6
Run Code Online (Sandbox Code Playgroud)

或者,如果你真的不得不避免t()那么你可以这样做:

> c(apply(x,2,rbind))
[1] 1 4 2 5 3 6
Run Code Online (Sandbox Code Playgroud)

这适用于任意数量的列,但包括应用.如果您不想使用那个,则必须手动指定要粘贴在彼此后面的所有列.但t()解决方案是迄今为止最快的:

> n <- 10000000    
> x <- matrix(rnorm(n),ncol=2)
> system.time(c(t(x)))
   user  system elapsed 
   0.07    0.00    0.06 

> system.time(c(rbind(x[,1],x[,2])))
   user  system elapsed 
   0.22    0.05    0.26 
Run Code Online (Sandbox Code Playgroud)

请记住,矩阵可以看作是添加了维度的向量,并且始终按列方式读取.所以你无法真正避免t()在你的解决方案中.您可以随时将其用作矢量,例如:

> x[4]
[1] 4
Run Code Online (Sandbox Code Playgroud)

只要你记得矩阵是按列读取的.所以在你的情况下你需要

> t(x)[4]
[1] 5
Run Code Online (Sandbox Code Playgroud)

如果您真的需要它作为矩阵,那么:

> matrix(t(x))
     [,1]
[1,]    1
[2,]    4
[3,]    2
[4,]    5
[5,]    3
[6,]    6
Run Code Online (Sandbox Code Playgroud)