Кодирование целых чисел в R в базовый 62-символьный вектор - PullRequest
5 голосов
/ 30 марта 2011

Какой быстрый способ кодировать целочисленные значения или числовые целые числовые значения в R в символьный вектор в кодировке 62, то есть строку, содержащую только [a-zA-Z0-9]? Будет ли достаточно перевода ответа на этот вопрос? преобразование числовой базы 10 в основание 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
}

Это чего-то не хватает?

Ответы [ 3 ]

3 голосов
/ 30 марта 2011

Вот решение, которое использует базу 36 с использованием [0-9A-Z], которое можно легко адаптировать для базы 62 с использованием [a-zA-Z0-9]. И да, это просто перевод решения другого вопроса, с которым вы связаны.

https://github.com/graywh/r-gmisc/blob/master/R/baseConvert.R

1 голос
/ 18 октября 2011

Вот вариант приведенного выше кода, который позволяет преобразовать вектор чисел в основание 16. Это не особенно элегантно, так как оно не векторизовано, но оно выполняет свою работу.

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))
} 
0 голосов
/ 30 марта 2011

Чтобы сделать это более стандартным, вы должны реализовать его аналогично преобразованию в шестнадцатеричное. (см. здесь для обозначения.)

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...