我有一个非常大的矩阵,其中包含列名和行名。这些列和行的名称相同,并包含一个带数字的三个字母的字符串。
三个字母的字符串会重复,只有数字会更改。重复几次后,字符串将更改,并且数字将从1重新开始。
举一个小例子,我有一个矩阵a
:
a <- matrix(c(1:36), nrow = 6, byrow = TRUE)
names <- paste(rep(c("aaa" , "bbb", "ccc"), each = 2) , rep(c(1:2) , times = 3))
rownames(a) <- names
colnames(a) <- names
给出:
aaa 1 aaa 2 bbb 1 bbb 2 ccc 1 ccc 2
aaa 1 1 2 3 4 5 6
aaa 2 7 8 9 10 11 12
bbb 1 13 14 15 16 17 18
bbb 2 19 20 21 22 23 24
ccc 1 25 26 27 28 29 30
ccc 2 31 32 33 34 35 36
对于这个矩阵的每个元素,我想做一个乘法。
因此,基本上,对于行/列名称的字符串不同的每个元素,我想匹配行名称/列名称的 number 并与其他字符串相乘。
如果"aaa"
与"bbb"
匹配,则:
matrix[aaa (number n), bbb (number m)] * matrix[bbb (number n), aaa (number m)]
如果"aaa"
等于"aaa"
,则
matrix[aaa (number n), aaa (number m)] * matrix[aaa (number n), aaa (number m)]
或基本上是平方的元素。
这看起来令人困惑,所以我举几个例子:
在matrix["aaa 1", "aaa 2"]
中,我将matrix["aaa 1", "aaa 2"]
与matrix["aaa 1", "aaa 2"]
(2 * 2)乘以4
在matrix["aaa 1", "bbb 2"]
中,我将matrix["aaa 1", "bbb 2"]
与matrix["bbb 1", "aaa 2"]
(4 * 14)相乘得到56
最后,矩阵应给出:
aaa 1 aaa 2 bbb 1 bbb 2 ccc 1 ccc 2
aaa 1 1 4 39 56 125 156
aaa 2 49 64 171 200 341 384
bbb 1 39 56 225 256 459 504
bbb 2 171 200 441 484 759 816
ccc 1 125 156 459 504 841 900
ccc 2 341 384 759 816 1225 1296
我使用的是可怕的代码:
b <- a^2
b[1,3] <- a[1,3] * a[3,1]
b[1,4] <- a[1,4] * a[3,2]
b[1,5] <- a[1,5] * a[5,1]
b[1,6] <- a[1,6] * a[5,2]
b[2,3] <- a[2,3] * a[4,1]
b[2,4] <- a[2,4] * a[4,2]
b[2,5] <- a[2,5] * a[6,1]
b[2,6] <- a[2,6] * a[6,2]
b[3,1] <- a[3,1] * a[1,3]
b[3,2] <- a[3,2] * a[1,4]
b[3,5] <- a[3,5] * a[5,3]
b[3,6] <- a[3,6] * a[5,4]
b[4,1] <- a[4,1] * a[2,3]
b[4,2] <- a[4,2] * a[2,4]
b[4,5] <- a[4,5] * a[6,3]
b[4,6] <- a[4,6] * a[6,4]
b[5,1] <- a[5,1] * a[1,5]
b[5,2] <- a[5,2] * a[1,6]
b[5,3] <- a[5,3] * a[3,5]
b[5,4] <- a[5,4] * a[3,6]
b[6,1] <- a[6,1] * a[2,5]
b[6,2] <- a[6,2] * a[2,6]
b[6,3] <- a[6,3] * a[4,5]
b[6,4] <- a[6,4] * a[4,6]
有没有可以让我进行此类匹配的代码?也许还有更多的字符串和数字吗?
答案 0 :(得分:3)
您可以使用data.table连接:
npm install
答案 1 :(得分:0)
一种简单的矢量化方法,可以使用base R实现:
b = expand.grid(dimnames(a))[2:1]
d = with(read.table(text=paste(b[,1],b[,2])),cbind(paste(V3,V2),paste(V1,V4)))
t(array(a[as.matrix(b)]*a[d],dim(a)))
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 4 39 56 125 156
[2,] 49 64 171 200 341 384
[3,] 39 56 225 256 459 504
[4,] 171 200 441 484 759 816
[5,] 125 156 459 504 841 900
[6,] 341 384 759 816 1225 1296