将R中的整数值或数字整数值编码为基本62编码中的字符向量的快速方法是什么,即只包含[a-zA-Z0-9]的字符串?翻译这个问题的答案是否足够? converting a number base 10 to base 62 (a-zA-Z0-9)
被修改
这是我的解决方案:
toBase <- function(num, base=62) {
bv <- c(seq(0,9),letters,LETTERS)
r <- num %% base
res <- bv[r+1]
q <- floor(num/base)
while (q > 0L) {
r <- q %% base
q <- floor(q/base)
res <- paste(bv[r+1],res,sep='')
}
res
}
to10 <- function(num, base=62) {
bv <- c(seq(0,9),letters,LETTERS)
vb <- list()
for (i in 1:length(bv)) vb[[bv[i]]] <- i
num <- strsplit(num,'')[[1]]
res <- vb[[num[1]]]-1
if (length(num) > 1)
for (i in 2:length(num)) res <- base * res + (vb[[num[i]]]-1)
res
}
这有什么遗漏吗?
答案 0 :(得分:3)
这是一个使用[0-9A-Z]进行基础36的解决方案,可以使用[a-zA-Z0-9]轻松地适应基础62。是的,它基本上只是将解决方案翻译成您链接的其他问题。
https://github.com/graywh/r-gmisc/blob/master/R/baseConvert.R
答案 1 :(得分:1)
以上代码的变体允许您将数字的向量转换为基数16.它不是特别优雅,因为它没有矢量化,但它完成了工作。< / p>
toBase <- function(num, base=16) {
bv <- c(0:9,letters,LETTERS)
r <- list()
q <- list()
res <- list()
for(i in 1:length(num)){
r[i] <- num[i] %% base
res[i] <- bv[r[[i]]+1]
q[i] <- floor(num[i]/base)
while (q[[i]] > 0L) {
r[i] <- q[[i]] %% base
q[i] <- floor(q[[i]]/base)
res[i] <- paste(bv[r[[i]]+1],res[[i]],sep='')
}
}
return(do.call('c', res))
}
答案 2 :(得分:0)
为了使其更加标准化,您应该以与转换为十六进制类似的方式实现它。 (有关命名,请参阅here。)
as.exindadeomode <- function(x)
{
#Give x a class of "exindadeomode"
#Contents as per as.hexmode
}
format.exindadeomode <- function (x, width = NULL, upper.case = FALSE, ...)
{
#Return appropriate characters
#Contents as per format.hexmode
}
要转换回整数,只需使用as.integer
剥离类。