我有两个矩阵A
和B
,其中包含维名称,但没有行名或列名。我想将它们相乘并继承尺寸名称。具体来说,我想将A
的转置(一个m乘n矩阵,行维度称为“变量”和列维度称为“学生”)乘以B
(m乘q矩阵)使用称为“Coefficients”的行维度和称为“models”的列维度来获取C
(n为q矩阵,行维度称为“Students”,列维称为“Models”)。下面的代码生成了正确的矩阵,但没有维度名称。
A = matrix(data = c(1:5, 10*(1:5)), nrow = 2, dimnames = list("Variables" = NULL, "students" = NULL))
B = matrix(data=c(1:6), nrow = 2, dimnames = list("Coefficients" = NULL, "models" = NULL))
A
B
dim(A)
dim(B)
dimnames(A)
dimnames(B)
C = crossprod(A,B)
C
dim(C)
dimnames(C)
我希望输出(只运行变量C
)如下所示:
Models
students [,1] [,2] [,3]
[1,] 5 11 17
[2,] 11 25 39
[3,] 25 55 85
[4,] 80 180 280
[5,] 140 320 500
答案 0 :(得分:3)
我不认为你可以直接使用crossprod
执行此操作,但我在其周围包裹了一小段代码似乎有效:
crossprod2 <- function(x, y){
row <- names(dimnames(x))[2] #save row name
col <- names(dimnames(y))[2] #save col name
cp <- crossprod(x,y) #run crossprod
dimnames(cp) <- list(NULL,NULL) #create dimnames
names(dimnames(cp)) <- c(row,col) #set the correct names
cp
}
或者,根据@PauldeBarros的评论,您也可以这样做:
crossprod2 <- function(x, y){ row <- dimnames(x)[2] #save row names
col <- dimnames(y)[2] #save col names
dn = list(row[[1]], col[[1]])
names(dn) = list(names(row), names(col))
cp <- crossprod(x,y) #run crossprod
dimnames(cp) <- dn #apply dimnames cp
cp
}
在这种情况下,任何行名称或列名称都将被保留。
输出:
> crossprod2(A,B)
models
students [,1] [,2] [,3]
[1,] 5 11 17
[2,] 11 25 39
[3,] 25 55 85
[4,] 80 180 280
[5,] 140 320 500