【问题标题】: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}))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-13
        • 2020-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多