【问题标题】:matrix-scalar multiplication within dataframes in RR中数据帧内的矩阵标量乘法
【发布时间】:2026-01-16 23:50:01
【问题描述】:

我有一个包含成本数据的数据框和一个单独的矩阵列表,该列表说明应如何分配每种类型的成本。为了便于说明,我做一些虚拟数据。

library(tidyverse)

# here is my list of cost allocation matrices
matrList <- list(A = cbind(runif(3),runif(3),runif(3)), 
                 B = cbind(runif(3),runif(3),runif(3)), 
                 C = cbind(runif(3),runif(3),runif(3))) %>% 
  lapply(function(x){
    rownames(x) <- c("x","y","z")
    colnames(x) <- c("p","q","r")
    x <- x/sum(x)
  })

# and here is my cost data
mydf <- data.frame(val = runif(8,0,100),
                   lookup = c("A","C","B","B","C","B","C","A")) 

因此,每种成本要么是 A 型、B 型或 C 型。对于这些类型中的每一种,都有一个总和为 1 的 3x3 矩阵来说明应如何分配成本。

我设法搞砸了一种left_join,它向包含适当矩阵的数据框添加了一列

mydf <- mydf %>%
    mutate(propMatrix = lapply(lookup, function(x) matrList[[x]]))

这似乎保留了矩阵的结构 - 很棒。只是现在我想将每个propMatrix 乘以数据框中相应的val,以得到包含实际分配成本的矩阵,而不仅仅是比例。乐观地说,我认为像 mutate(valMatrix = val*propMatrix) 这样简单的东西可能会起作用,但不会。

有人有什么聪明的主意吗?我想它可以作为最后的手段在循环中完成,但考虑到我的实际数据的大小,它并不是非常实用。我也不认为放弃在数据框中包含矩阵的方法并将其放在带有复制行的长格式中是不切实际的,因为每个矩阵约为 600x100。

任何想法都非常感谢。

提前致谢, 詹姆斯

【问题讨论】:

    标签: r dataframe matrix


    【解决方案1】:

    我们可能需要map2

    mydf %>%
        mutate(valMatrix = map2(propMatrix, val, `*`)) 
    

    【讨论】:

    • 这很简单。谢谢!