R: Как изменить масштаб моей матрицы по столбцам

#r

#r #матрица #матрица-умножение

Вопрос:

У меня есть матрица болезненных состояний states0CommercialA , где столбцы являются состояниями (т. Е. «нет болезни», «заболевание», «мертвый»), а строки представляют собой циклы модели (т. Е. 1, 2, 3, 4 и т.д.).

Я пытаюсь умножить это на вектор затрат commercialMedExp , где каждая стоимость соответствует состоянию заболевания. Я попытался выполнить следующее:

 commercialMedExp * states0CommercialA
  

но кажется, что умножение происходит по столбцам, а не по строкам. Может ли кто-нибудь помочь мне с правильным синтаксисом?

Ответ №1:

Изменение масштаба столбца / строки является обычной операцией при вычислении матрицы. Вы ищете изменение масштаба столбца, но я предложу решения для обоих.


Изменение масштаба строк

 A <- matrix(1:20, nrow = 5); x <- 1:5
## Any method below is much more efficient than `diag(x) %*% A`

## method 1: recycling
A * x

## method 2: `sweep()`
sweep(A, 1L, x, "*")
  

Изменение масштаба столбца

 A <- matrix(1:20, nrow = 5); y <- 1:4
## Any below method is much more efficient than `A %*% diag(y)`

## method 1: transpose   row rescaling
t(y * t(A))

## method 2: `sweep()`
sweep(A, 2L, y, "*")

## method 3: pairwise multiplication
A * rep(y, each = nrow(A))
  

Что вы можете сделать

 states0CommercialA * rep(commercialMedExp, each = nrow(states0CommercialA))
  

Ответ №2:

Что-то вроде

 commercialMedExp0A <- t(apply(states0CommercialA, 1, function(x){ x * commercialMedExp}))
  

должно работать до тех пор, пока количество столбцов в states0CommericialA будет такой же длины, как commercialMedExp . Если это не так, вам пришлось бы подмножествовать данные. Например, если болезненные состояния указаны в столбцах с 13 по 18

     commercialMedExp0A <- t(apply(states0CommercialA[,c(13:18)], 1, function(x){ x * commercialMedExp}))