R将基质细胞粘在一起

时间:2016-02-23 21:51:53

标签: r

我想将矩阵的单元格粘贴在一起,但是当我执行paste()时,它会返回一个向量。 R中有相同的直接函数吗?

mat <- matrix(1:4,2,2)
paste(mat,mat,sep=",")

我希望输出为

     [,1] [,2]
[1,]  1,1  2,2
[2,]  3,3  4,4

3 个答案:

答案 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)

或将sprintfdim<-

一起使用
`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"