【问题标题】:R: How to rescale my matrix by columnR:如何按列重新调整我的矩阵
【发布时间】:2017-01-10 19:26:04
【问题描述】:
我有一个疾病状态矩阵states0CommercialA,其中列是状态(即“无疾病”、“疾病”、“死亡”),行是模型周期(即 1、2、3、 4 等)。
我试图将其乘以成本向量commercialMedExp,其中每个成本对应于一种疾病状态。我尝试了以下方法:
commercialMedExp * states0CommercialA
但似乎乘法是跨列而不是跨行发生的。有人可以帮助我正确的语法吗?
【问题讨论】:
标签:
r
matrix
matrix-multiplication
【解决方案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}))