不同大小的矩阵相乘

Matrices of difent size multiplication

晚上好

在 Rstudio 中

我在将这两个不同大小的矩阵相乘时遇到问题,而且情况变得更糟,因为我必须以 d2$ID=1 行中的值相乘的方式相乘 只有 w$sample=1 的重复。

样本和ID表示是同一个样本

换句话说,从 "subset" d2$ID=1 开始,每个值 ("L1"、"ST"、"GR"、"CB"、 "HSK", "DDM") 必须乘以整个 "subset" w$sample=1(在这种情况下是 4 行,但并非总是如此),是的,所有值 "G2", "G4"、"G6"、"G8"、"G12"

>d2
   ID    L1      ST           GR        CB         HSK         DDM
1   1 0.1662000 0.2337000 0.3637000 0.11110000 0.10100000   0.024300000
2   2 0.1896576 0.2280830 0.3705740 0.09406879 0.09319434   0.024422281
3   3 0.1110259 0.2217769 0.4180797 0.11122498 0.10902635   0.028866094
4   4 0.1558785 0.2008862 0.4222565 0.09805538 0.10218119   0.020742172
5   5 0.1536421 0.1674096 0.4205395 0.14362176 0.08635519   0.028431849
6   6 0.1841964 0.1514189 0.4603306 0.10243621 0.08928011   0.012337688

> w
           sample   G2      G4      G6      G8      G12
1              1    10.9    15.9    21.4    28.0    37.8
2              1    11.5    16.6    22.2    29.5    38.3
3              1    10.3    15.1    20.7    28.3    36.7
4              1    11.7    18.1    24.8    31.2    39.5
5              2    11.0    16.8    22.4    30.6    38.0
6              2    10.1    15.9    22.5    30.2    36.7
7              2    12.8    17.8    22.8    28.7    37.1
8              2    11.8    16.3    20.8    27.3    34.7
9              2    11.9    16.7    21.6    28.3    34.6
10             3    12.0    18.1    24.2    30.9    40.0
11             3    12.2    17.7    24.2    31.7    40.5
12             4    11.1    16.5    22.7    31.0    39.2
13             4    12.5    19.8    27.4    32.8    38.8
14             4    12.4    19.2    25.8    33.0    39.9
15             4    12.4    19.2    26.2    33.4    38.9
16             4    13.4    18.3    23.7    30.0    38.2
17             5    13.3    18.6    24.0    30.7    38.4
18             5    13.3    18.1    22.9    30.1    36.8
19             5    13.7    19.9    26.5    33.8    43.0
20             5    12.7    18.2    24.6    32.5    41.3
21             6    12.1    17.5    24.3    33.7    42.2
22             6    14.5    20.8    28.4    35.3    43.7

我已经检查了很多问题,但我无法弄清楚,特别是因为大部分信息都是针对相同大小的矩阵。

我试过从d2过滤数据,但是数据集真的很大,效率真的很低。

我是一个初学者,如果你认为是那么容易的话,至少请指点一下! 我有几个这样的数据集...

提前致谢!

这似乎符合要求:

res <- apply(w, 1, function(x){ unclass(
                      outer(as.matrix( x[-1] ), 
                            as.matrix( d2[1, c( "L1", "ST", "GR", "CB", "HSK", "DDM")])))})
str(res)

# result
# num [1:30, 1:22] 1.81 2.64 3.56 4.65 6.28 ...
# - attr(*, "dimnames")=List of 2
#  ..$ : NULL
#  ..$ : chr [1:22] "1" "2" "3" "4" ...

我几乎在第一遍就做对了,但经过一些调试后发现我需要将 as.matrix 调用添加到外部的两个参数中(可以这么说;-)。为了解释我的逻辑......我想 运行 用 apply 向下排列 w 的每一行,然后对第一列(w 的每一行)的值使用 match 到d2 的唯一行。 match 函数就是为此目的而设计的,return 一个合适的数字用于索引。然后对于行的其余部分(x[-1] 通过函数调用时),我将在与 d2 的所需行和列交叉的行值上使用 outer .如果您在没有调用 as.matrix 的情况下执行此操作,您会收到一条错误消息:

Error in tcrossprod(x, y) : 
  requires numeric/complex matrix/vector arguments

我不认为这是一个非常有用的错误消息。两个参数都是数值向量。