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

时间:2016-04-21 01:54:20

标签: r

我有这个矩阵

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

我想有这个输出

apply(matrix(letters[1:10],2),2,paste0)

因此基本上是一个载体。我怎么能这样?我正在尝试像URL resources这样的东西,但它不起作用。

2 个答案:

答案 0 :(得分:6)

这似乎可以做你想要的:

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

答案 1 :(得分:4)

另一种选择是转换为data.frame并将do.callpaste

一起使用
matrix(do.call(paste0, as.data.frame(m1)))
#     [,1]   
#[1,] "acegi"
#[2,] "bdfhj"

注意:它比循环遍历每一行更快。

基准

set.seed(24)
m2 <- matrix(sample(letters, 1e7*4, replace=TRUE), ncol=4)
system.time(matrix(apply(m2, 1, paste, collapse="")))
#   user  system elapsed 
#  75.81    0.27   76.44 

system.time(matrix(do.call(paste0, as.data.frame(m2))))
#  user  system elapsed 
#   9.62    0.14    9.76 

使用@ Frank的变体

system.time(matrix(do.call(paste0, split(m2, col(m2)))))
#  user  system elapsed 
#  9.54    0.19    9.75 

由于@PierreLafortune想要检查具有更多列数的数据集,

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 

如果行数和列数相同,比如5000 x 5000,那么

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 

apply方法稍快,但我假设OP的数据集中的行数多于列数。