Выполните арифметические матричные операторы, если это соответствует критериям в R - PullRequest
0 голосов
/ 05 июня 2018

У меня есть три матрицы (игнорируйте значения, они только для иллюстрации).a, b и c имеют одинаковые переменные (они имеют одинаковые столбцы / переменные и "позиционирование", но измеряют разные вещи)

# my actual mat is 120x80
a = rbind(c(1,1,2,3,1), c(2,2,3,1,2), c(3,3,1,2,1)) 
a
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    2    3    1
[2,]    2    2    3    1    2
[3,]    3    3    1    2    1

# my actual mat is 120x80    
b = rbind(c(0.8,0.6,0.7,0.8,0.9), c(0.6,0.7,0.8,0.7,0.6), c(0.8,0.9,0.7,0.6,0.9))
b
     [,1] [,2] [,3] [,4] [,5]
[1,]  0.8  0.6  0.7  0.8  0.9
[2,]  0.6  0.7  0.8  0.7  0.6
[3,]  0.8  0.9  0.7  0.6  0.9

# my actual mat 120x80
c = rbind(c(0.1,0.1,0.3,0.2,0.1), c(0.3,0.2,0.1,0.2,0.1), c(0.2,0.3,0.1,0.2,0.3))
c
     [,1] [,2] [,3] [,4] [,5]
[1,]  0.1  0.1  0.3  0.2  0.1
[2,]  0.3  0.2  0.1  0.2  0.1
[3,]  0.2  0.3  0.1  0.2  0.3

Мы берем строки из b и строки из c

If 1 in a[1,] then b[1,]-c[1,], else -c[1,]
If 2 in a[1,] then b[1,]-c[1,], else -c[1,]    or simply 0-c[1,]
If 3 in a[1,] then b[1,]-c[1,], else -c[1,]

d.row1 (a 3x80 matrix)
rownames(drow1)<-c("1","2","3")
  [,1] [,2] [,3] [,4] [,5]
1  0.7  0.5 -0.3 -0.2  0.8
2 -0.1 -0.1  0.4 -0.2 -0.1
3 -0.1 -0.1 -0.3  0.6 -0.1

Обратите внимание, что d.row1[1,1], d.row1[1,2] и d.row1[1,5] имеют классификацию 1 в a[1,], в то время как другие значения в строке 1 имеют значения 2 или3. Следовательно, мы выполнили операцию b[1,]-c[1,] вместо -c[1,].

Выглядит это так:

enter image description here

Аналогично, для строки a[2,]

If 1 in a[2,] then b[2,]-c[2,], else -c[2,]
If 2 in a[2,] then b[2,]-c[2,], else -c[2,]    or simply 0-c[2,]
If 3 in a[2,] then b[2,]-c[2,], else -c[2,]

d.row2 (a 3x80 matrix)
  [,1] [,2] [,3] [,4] [,5]
1 -0.3 -0.2 -0.1  0.5 -0.1
2  0.3  0.5 -0.1 -0.2  0.5
3 -0.3 -0.2  0.7 -0.2 -0.1

Обратите внимание, что d.row1 и d.row2 происходят из строки 1 и строки 2 из a, b и c соответственно.

Я хочу создать список для каждой строки в a, b и c.Всего 120 кадров данных в списке (потому что у меня 120 строк в других матрицах).

Я думаю, что for петли или аналогичные могут быть полезны для моей проблемы.

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

1 Ответ

0 голосов
/ 05 июня 2018

Ваша основная операция может быть вычислена с использованием (для строки 1 из a)

d.row1 <-  b[rep(1, 3), ] * outer(1:3, a[1,], "==") - c[rep(1, 3), ]

Список может быть выполнен с использованием lapply - другие параметры не дают параметров для правильного ввода/ output (tapply требует векторного ввода, apply разрешает только матричный вывод).

Вот конечный результат:

d <- lapply(1:nrow(a), function(i) {
  c[rep(i,3),]* outer(1:3, a[i,], "==") - c[rep(i,3),]
})

> d
[[1]]
     [,1] [,2] [,3] [,4] [,5]
[1,]  0.7  0.5 -0.3 -0.2  0.8
[2,] -0.1 -0.1  0.4 -0.2 -0.1
[3,] -0.1 -0.1 -0.3  0.6 -0.1

[[2]]
     [,1] [,2] [,3] [,4] [,5]
[1,] -0.3 -0.2 -0.1  0.5 -0.1
[2,]  0.3  0.5 -0.1 -0.2  0.5
[3,] -0.3 -0.2  0.7 -0.2 -0.1

[[3]]
     [,1] [,2] [,3] [,4] [,5]
[1,] -0.2 -0.3  0.6 -0.2  0.6
[2,] -0.2 -0.3 -0.1  0.4 -0.3
[3,]  0.6  0.6 -0.1 -0.2 -0.3
...