目前,我正在执行以下操作:
x <- cbind(c(1, 2, 3), c(4, 5, 6))
x.merged <- matrix(t(x), ncol=1)
从矩阵
1, 4, 2, 5, 3, 6,
创建具有值x
的一列。但是依靠t(x)
似乎有点笨拙。有一个更好的方法吗?如果有一个更简单的内置函数来处理这种事情,我想避免使用for循环或apply
。编辑:为了更清楚,
x
只是给我的。上面的第一行代码仅用于说明所涉及的值。我写这样可能更好:> x
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
最佳答案
实际上,如果将其设为向量,则只需花费以下时间:
> c(t(x))
[1] 1 4 2 5 3 6
或者,如果您确实必须避免使用
t()
,则可以执行以下操作:> c(apply(x,2,rbind))
[1] 1 4 2 5 3 6
这适用于任意数量的列,但包含一个套用。如果您不想使用该列,则必须手动指定要粘贴到彼此后面的所有列。但是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
请记住,矩阵可以看作是添加了维度的向量,并且始终按列读取。因此,您无法真正避免解决方案中的
t()
。您始终可以将其用作向量,例如:> x[4]
[1] 4
只要您记得矩阵是按列读取的,它就可以工作。因此,您需要
> t(x)[4]
[1] 5
如果您真的需要它作为矩阵,那么:
> matrix(t(x))
[,1]
[1,] 1
[2,] 4
[3,] 2
[4,] 5
[5,] 3
[6,] 6
关于r - 在R/Splus中将两列变成一列的更好方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5494349/