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