Матрицы умножения разных размеров - PullRequest
1 голос
/ 04 мая 2020

Добрый вечер

В Rstudio

У меня проблема с умножением этих двух матриц разного размера, и становится хуже, потому что мне приходится умножать таким образом, чтобы значения в строка d2 $ ID = 1 должна умножить только повторений w $ sample = 1.

образец и идентификатор указывают на один и тот же образец

Другими словами, из «подмножества» d2 $ ID = 1, каждое отдельное значение («L1», «ST», «GR», «CB», «HSK», «DDM») должны умножить все «подмножество» 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, но набор данных действительно большой, а затем действительно неэффективный.

Я новичок, если вы считаете, что это так просто, я был бы признателен, по крайней мере, намек, пожалуйста! У меня есть несколько наборов данных, подобных этим ...

Заранее спасибо!

1 Ответ

0 голосов
/ 04 мая 2020

Кажется, это работает так, как было запрошено:

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 к обоим аргументам во внешнем (так говорить ;-). Чтобы объяснить мою логику c ... Я хотел выполнить каждую строку w с помощью apply, а затем использовать match для значения первого столбца (каждой строки w) до уникальной строки d2. Функция match предназначена именно для этой цели, чтобы вернуть подходящий номер, который будет использоваться для индексации. Затем с остальной частью строки (x[-1] к тому времени, когда она прошла через вызов функции), я бы использовал outer для значений строки, пересекаемых с нужной строкой и столбцами d2. Если вы делаете это без вызовов as.matrix, вы получаете сообщение об ошибке:

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

Я не думаю, что это очень информативное сообщение об ошибке. Оба аргумента были цифрами c векторов.

...