我有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
}
有任何建议如何做到这一点?
答案 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))
}