R

时间:2017-11-22 15:11:04

标签: r dataframe matrix

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

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.对于这些类型中的每一种,都有一个3x3矩阵,总和为1,说明应该如何分配成本。

我设法捣毁了一种left_join,它为包含相应矩阵的数据框添加了一列

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

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

有没有人有任何聪明的想法?我认为它可以作为最后的手段在循环中完成,但考虑到我的实际数据的大小,它并不是非常实用。我也认为放弃在数据帧中使用矩阵的方法并将其放在具有复制行的长格式中是不切实际的,因为每个矩阵都是~600x100。

任何想法都非常感激。

提前致谢, 詹姆斯

1 个答案:

答案 0 :(得分:1)

我们可能需要map2

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