【发布时间】:2022-05-08 21:42:33
【问题描述】:
我想将矩阵的单元格粘贴在一起,但是当我粘贴()时,它返回一个向量。 R中是否有相同的直接功能?
mat <- matrix(1:4,2,2)
paste(mat,mat,sep=",")
我希望输出为
[,1] [,2]
[1,] 1,1 2,2
[2,] 3,3 4,4
【问题讨论】:
标签: r
我想将矩阵的单元格粘贴在一起,但是当我粘贴()时,它返回一个向量。 R中是否有相同的直接功能?
mat <- matrix(1:4,2,2)
paste(mat,mat,sep=",")
我希望输出为
[,1] [,2]
[1,] 1,1 2,2
[2,] 3,3 4,4
【问题讨论】:
标签: r
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 等)。
这个特殊的函数循环使用向量并输出一个矩阵,其维数与各种输入中最大的匹配。
【讨论】:
mat[] <- paste(mat, mat, sep = ","),但这会覆盖原来的mat
Joran 的另一种方法是使用[] 而不是重构矩阵。这样你也可以保留 colnames 例如:
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"
【讨论】:
或者使用sprintf 和dim<-
`dim<-`(sprintf('%d,%d', mat, mat), dim(mat))
# [,1] [,2]
#[1,] "1,1" "3,3"
#[2,] "2,2" "4,4"
【讨论】:
ascii 库有一个函数 paste.matrix 用于跨矩阵按元素粘贴。输出是所需结果的转置,但这很容易通过t() 解决。
library(ascii)
mat <- matrix(1:4,2,2)
t(paste.matrix(mat,mat,sep=","))
[,1] [,2]
[1,] "1,1" "2,2"
[2,] "3,3" "4,4"
【讨论】: