R 如何将矩阵中的所有列折叠到第一列?

R 如何将矩阵中的所有列折叠到第一列?,r,R,我有这个矩阵 > matrix(letters[1:10],2) [,1] [,2] [,3] [,4] [,5] [1,] "a" "c" "e" "g" "i" [2,] "b" "d" "f" "h" "j" 我想要这个输出 [,1] [1,] "acegi" [2,] "bdfhj" 所以基本上是一个向量,我怎么能这样呢?我尝试了一些类似于apply(矩阵(字母[1:10],2),2,0)的方法,但它不起作用。这似乎是你想要的: ma

我有这个矩阵

> matrix(letters[1:10],2)
     [,1] [,2] [,3] [,4] [,5]
[1,] "a"  "c"  "e"  "g"  "i" 
[2,] "b"  "d"  "f"  "h"  "j" 
我想要这个输出

    [,1] 
[1,] "acegi" 
[2,] "bdfhj" 

所以基本上是一个向量,我怎么能这样呢?我尝试了一些类似于
apply(矩阵(字母[1:10],2),2,0)
的方法,但它不起作用。

这似乎是你想要的:

matrix(apply(m, 1, function(x) paste(x, collapse = '')))
    [,1]   
[1,] "acegi"
[2,] "bdfhj"

另一个选项是转换为
data.frame
并使用
do.call
paste

matrix(do.call(paste0, as.data.frame(m1)))
#     [,1]   
#[1,] "acegi"
#[2,] "bdfhj"
注意:它比在每一行中循环快

基准 由于@Pierrelaffortune希望使用列数更多的数据集进行检查

set.seed(49)
m2 <- matrix(sample(letters, 1e6*10, replace=TRUE), ncol=10)
system.time(matrix(apply(m2, 1, paste, collapse="")))
#  user  system elapsed 
#  8.90    0.00    8.89 
system.time(matrix(do.call(paste0, as.data.frame(m2))))
#  user  system elapsed 
#  1.92    0.00    1.92 
set.seed(49)

m2在第二个参数中用1而不是2应用?不,这只是按行应用函数。不需要匿名函数,
apply(m,1,paste,collapse=“”)
是的,只是一个习惯……可能是坏习惯。:)不过,从列的角度来看,这会崩溃。如果这是你想要的,没问题。编辑…它被忽略了。:)不,向上投票,然后我会说“哇,真的可以吗?让我检查一下”。还是觉得有点奇怪。它甚至可以像
do.call(粘贴0,拆分(m2,col(m2))
可能是4列吗?尝试使用更多的COL查看数据帧开销可能我猜最小值约为
系统时间(粘贴0(m2[,1],m2[,2],m2[,3],m2[,4])
,而您仅比这高出50%。这可能是通过eval解析的东西实现的(但我不会这么做)。谢谢你详尽的回答。值得一提的是,您的解决方案速度更快这一事实对我来说是非常违反直觉的。在我的系统上,这一点稍微快了一点:
system.time({n=nrow(m2);do.call(paste0,lapply(seq_len(ncol(m2)),function(j)m2[seq(to=j*n,length.out=n)])}
。当然更复杂。
system.time(matrix(do.call(paste0, split(m2, col(m2)))))
#  user  system elapsed 
#  9.54    0.19    9.75 
set.seed(49)
m2 <- matrix(sample(letters, 1e6*10, replace=TRUE), ncol=10)
system.time(matrix(apply(m2, 1, paste, collapse="")))
#  user  system elapsed 
#  8.90    0.00    8.89 
system.time(matrix(do.call(paste0, as.data.frame(m2))))
#  user  system elapsed 
#  1.92    0.00    1.92 
set.seed(37)
m2 <- matrix(sample(letters, 5000*5000, replace=TRUE), ncol=1000)
system.time(matrix(apply(m2, 1, paste, collapse="")))
#   user  system elapsed 
#  5.42    0.00    5.42 
system.time(matrix(do.call(paste0, as.data.frame(m2))))
#  user  system elapsed 
#  7.42    0.00    7.43 
system.time({n = nrow(m2)
     do.call(paste0, lapply(seq_len(ncol(m2)),
       function(j) m2[seq(to=j*n, length.out=n)]))})
#  user  system elapsed 
#  6.19    0.00    6.20