如何生成1-1变量组合到数字Id的映射

时间:2016-12-27 19:51:03

标签: r

我有9个产品。篮子可以包含任何产品组合,使得每个产品在篮子中出现0-9次。例如,basket1可能包含0个product1,3个product2,1个product3等。

我想为每个篮子生成一个独特的BasketId。而不是做明显的Id,对于上面的例子,它将是一个像“product1_0 product2_3 ...”这样的长字符串,我想使用数字Id来提高存储效率。

由于有9种产品,每种产品可能出现10次,因此应该有10 ^ 9种可能的组合。所以我应该能够创建像

这样的映射
get_basketId <- function(p1, p2, p3, p4, p5, p6, p7, p8, p9){
  # given the count of each product, return a unique numeric id

}

也是可逆的

get_product_counts <- function(get_basketId){
  # given a basketId, return the count of each product

}

有任何建议如何做到这一点?

另请注意,enter image description here是一种理论解决方案,但遗憾的是,Cantor Pairing会导致不必要的大ID溢出。

2 个答案:

答案 0 :(得分:2)

我喜欢hexmode。这是一个更短,更整洁的身份。

get_basketId <- function(...){
  args <- list(...)
  num <- as.integer(paste0(c(1, unlist(args)),collapse=""))
  as.hexmode(num)
}

get_product_counts <- function(basketId){
  num <- as.integer(as.hexmode(basketId))
  res <- as.integer(strsplit(as.character(num), "")[[1]])[-1]
  setNames(res, paste0("p", 1:length(res)))
}

get_basketId(1, 2, 3, 4)
#[1] "2be2"

get_product_counts("2be2")
#p1 p2 p3 p4 
# 1  2  3  4 

答案 1 :(得分:1)

如果您有M种不同类型的项目的集合,每种项目都可以指定0 ... N次,那么经典的解决方案是使用M位数字(N + 1)编码。

如果我们减少类型数量,但代码是相同的,那么演示会更容易。

get_basketId <- function(p1, p2) {
    return (10*p2 + p1)
}

get_product_counts <- function(id) {
    return (list(id %/% 10, id %% 10))
}