我想将矩阵的单元格粘贴在一起,但是当我执行paste()时,它会返回一个向量。 R中有相同的直接函数吗?
mat <- matrix(1:4,2,2)
paste(mat,mat,sep=",")
我希望输出为
[,1] [,2]
[1,] 1,1 2,2
[2,] 3,3 4,4
答案 0 :(得分:6)
R中的矩阵只是一个带有指定尺寸属性的向量。当你将paste
放在一起时,你只是丢失了维度属性。
所以,
matrix(paste(mat,mat,sep=","),2,2)
或者,例如
mat1 <- paste(mat,mat,sep=",")
> mat1
[1] "1,1" "2,2" "3,3" "4,4"
> dim(mat1) <- c(2,2)
> mat1
[,1] [,2]
[1,] "1,1" "3,3"
[2,] "2,2" "4,4"
以下是您可以编写一个简单函数来执行此操作的一个示例:
paste_matrix <- function(...,sep = " ",collapse = NULL){
n <- max(sapply(list(...),nrow))
p <- max(sapply(list(...),ncol))
matrix(paste(...,sep = sep,collapse = collapse),n,p)
}
...但您想要的具体功能将取决于您希望它如何处理两个以上的矩阵,不同维度的矩阵或可能完全不可接受的输入(随机对象,NULL
等)
此特定功能可循环使用矢量并输出矩阵,其尺寸与各种输入中的最大值相匹配。
答案 1 :(得分:1)
或将sprintf
与dim<-
`dim<-`(sprintf('%d,%d', mat, mat), dim(mat))
# [,1] [,2]
#[1,] "1,1" "3,3"
#[2,] "2,2" "4,4"
答案 2 :(得分:1)
Joran方法的另一种方法是使用[]
而不是重建矩阵。这样,您还可以保留名称,例如:
truc <- matrix(c(1:3, LETTERS[3:1]), ncol=2)
colnames(truc) <- c("A", "B")
truc[] <- paste(truc, truc, sep=",")
truc
# A B
# [1,] "1,1" "C,C"
# [2,] "2,2" "B,B"
# [3,] "3,3" "A,A"