我有这个矩阵
[,1]
[1,] "acegi"
[2,] "bdfhj"
我想有这个输出
apply(matrix(letters[1:10],2),2,paste0)
因此基本上是一个载体。我怎么能这样?我正在尝试像URL resources
这样的东西,但它不起作用。
答案 0 :(得分:6)
这似乎可以做你想要的:
matrix(apply(m, 1, function(x) paste(x, collapse = '')))
[,1]
[1,] "acegi"
[2,] "bdfhj"
答案 1 :(得分:4)
另一种选择是转换为data.frame
并将do.call
与paste
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的数据集中的行数多于列数。