【问题标题】:Use lookup table to build matrix from list of vectors使用查找表从向量列表构建矩阵
【发布时间】:2021-11-19 03:53:57
【问题描述】:

有 A、B 和 C 三个公司。它们的费率存储在向量中。

A <- c(19, 19, 19, 20, 12)
B <- c(19, 19, 20, 20, 20, 20, 19, 19, 19, 11)
C <- c(13, 13)

在此示例中,有 17 个费率,但只有 5 个唯一费率。 每个费率对应于 12 个月内的月费,这在各公司之间是相同的。

> str(fees)
List of 5
 $ 19: num [1:12] 8.5 24.8 40.9 56.6 72.1 ...
 $ 20: num [1:12] 8.9 26.1 42.9 59.4 75.7 ...
 $ 12: num [1:12] 5.5 16.1 26.6 37 47.2 57.4 67.4 77.3 87.1 96.8 ...
 $ 11: num [1:12] 4.8 13.9 23 31.9 40.8 49.6 58.3 66.9 75.5 83.9 ...
 $ 13: num [1:12] 5.9 17.4 28.6 39.8 50.8 61.7 72.4 83.1 93.6 104 ...

目标是为每家公司建立费用矩阵。所以对于 A,费用矩阵为:

    [,1] [,2] [,3] [,4] [,5] [,6]  [,7]  [,8]  [,9] [,10] [,11] [,12]
[1,]  8.5 24.8 40.9 56.6 72.1 87.4 102.4 117.1 131.6 145.9 159.9 173.1
[2,]  8.5 24.8 40.9 56.6 72.1 87.4 102.4 117.1 131.6 145.9 159.9 173.1
[3,]  8.5 24.8 40.9 56.6 72.1 87.4 102.4 117.1 131.6 145.9 159.9 173.1
[4,]  8.9 26.1 42.9 59.4 75.7 91.6 107.3 122.7 137.9 152.7 167.3 181.3
[5,]  5.5 16.1 26.6 37.0 47.2 57.4  67.4  77.3  87.1  96.8 106.4 114.6

我的猜测是构建这些矩阵的最佳方法是使用查找表,但我不确定如何做到这一点。

R 脚本

A <- c(19, 19, 19, 20, 12)
B <- c(19, 19, 20, 20, 20, 20, 19, 19, 19, 11)
C <- c(13, 13)

all_comp <- c(A, B, C)
unique_comp <- unique(all_comp)

# Only 5 unique rates
# 19 20 12 11 13

fees <- list('19' = c(8.5,  24.8,  40.9,  56.6,  72.1,  87.4, 102.4, 117.1, 131.6, 145.9, 159.9, 173.1), 
             '20' = c(8.9,  26.1,  42.9,  59.4,  75.7,  91.6, 107.3, 122.7, 137.9, 152.7, 167.3, 181.3),
             '12' = c(5.5,  16.1,  26.6,  37.0,  47.2,  57.4,  67.4,  77.3,  87.1,  96.8, 106.4, 114.6),
             '11' = c(4.8,  13.9,  23.0,  31.9,  40.8,  49.6,  58.3,  66.9,  75.5,  83.9,  92.3,  99.3),
             '13' = c(5.9,  17.4,  28.6,  39.8,  50.8,  61.7,  72.4,  83.1,  93.6, 104.0, 114.2, 123.1))

# Desired result
A_m <- matrix(c(rep(fees[['19']], 3), fees[['20']], fees[['12']]), 5, 12, byrow = TRUE)

【问题讨论】:

    标签: r lookup-tables


    【解决方案1】:

    更新:

    感谢comment below,函数可能短到:

    desired_result <- function(input_vec, fees) (result <- fees[as.character(input_vec)])
    
    result <- desired_result(A, fees)
    

    然后就可以很方便的转换成矩阵了:

    result_matrix <- matrix(unlist(result),
                            nrow = length(result),
                            ncol = length(result[[1]]))
    

    旧答案

    把它包装成一个单独的函数怎么样:

    desired_result <- function(input_vec, fees) {
      N <- length(input_vec)  
      result <- list()
      
      for (i in 1:N) {
        result[[i]] <- fees[[as.character(input_vec[i])]]
      }
      
      return(result)
    }
    

    【讨论】:

    • 您可以一次完成所有选择fees[as.character(input_vec)] 而不是循环。
    【解决方案2】:

    您应该将公司费率存储在一个命名列表中,并将费用存储在一个矩阵中,其行名称对应于唯一的费率值。

    rates <- list(A = A, B = B, C = C)
    
    lookup <- matrix(unlist(fees), ncol = length(fees[[1L]]), byrow = TRUE, dimnames = list(names(fees), NULL))
    

    然后你可以使用矩阵作为查找表如下:

    res <- lapply(rates, function(x) lookup[as.character(x), ])
    

    结果是公司费用矩阵的命名列表,res[["A"]] 提取公司 A 的费用矩阵,依此类推。

    仅供参考,您可以通过阅读子集运算符的帮助页面来了解索引向量和数组的不同方法,可通过?`[` 访问。在这里,我们使用一个字符向量来索引lookup 的行,该字符向量的元素是矩阵行名的子集(有重复项)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 2014-07-06
      • 1970-01-01
      相关资源
      最近更新 更多