矩阵的元素取决于行名称和列名称的数字和字符串

时间:2018-08-01 10:45:47

标签: r

我有一个非常大的矩阵,其中包含列名和行名。这些列和行的名称相同,并包含一个带数字的三个字母的字符串。

三个字母的字符串会重复,只有数字会更改。重复几次后,字符串将更改,并且数字将从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]

有没有可以让我进行此类匹配的代码?也许还有更多的字符串和数字吗?

2 个答案:

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