使用 lookup table 从向量列表构建矩阵

Use lookup table to build matrix from list of vectors

有 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 个费率,但只有五个不同的费率。 每个费率对应 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

我猜想构建这些矩阵的最佳方式是查找 table,但我不确定该怎么做。

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)

更新:

多亏了,这个函数可能会变得很短:

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)
}

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

rates <- list(A = A, B = B, C = C)

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

然后您可以使用矩阵作为查找 table,如下所示:

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

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

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