目前,我正在执行以下操作:

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/

10-13 00:31