R:如何按列重新缩放矩阵

R: How to rescale my matrix by column

我有一个疾病状态矩阵 states0CommercialA,其中列是状态(即 "no disease"、"disease"、"dead"),行是模型周期(即 1、2、3、4 等)。

我正在尝试将其乘以成本向量 commercialMedExp,其中每个成本对应于一种疾病状态。我尝试了以下操作:

commercialMedExp * states0CommercialA

但看起来好像乘法是跨列而不是跨行发生的。有人可以帮助我正确的语法吗?

类似

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}))

列/行重新缩放是矩阵计算中的常见操作。您正在寻找列重缩放,但我会为两者提供解决方案。


行重新缩放

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))