# "numeric to alphabetic lettering function in r " Code Answer

3

here are some alternatives:

1) encode let b be the base. here b = 26. then there are b^k appendices having k letters so for a particular appendix having number x it has n letters if n is the smallest integer for which b + b^2 + ... + b^n >= x. the lhs of this inequality is a geometric series and therefore has a closed form solution. replacing the lhs with that expression and solving the resulting equation for n gives the formula for n in the code below. then we subtract all b^k terms from number for which k < n and use the apl-like `encode` function found here (and elsewhere on the web). `encode` does the base conversion giving `digits`, a vector of digits in base `base`. finally add 1 to each digit and use that as a lookup into `letters`.

``````app2 <- function(number, base = 26) {
n <- ceiling(log((1/(1 - base) - 1 - number) * (1 - base), base = base)) - 1
digits <- encode(number - sum(base^seq(0, n-1)), rep(base, n))
paste(letters[digits + 1], collapse = "")
}

sapply(1:29, app2) # test
``````

giving:

``````[1] "a"  "b"  "c"  "d"  "e"  "f"  "g"  "h"  "i"  "j"  "k"  "l"  "m"  "n"  "o"
[16] "p"  "q"  "r"  "s"  "t"  "u"  "v"  "w"  "x"  "y"  "z"  "aa" "ab" "ac"
``````

another test to try is:

``````sapply(1:60, app2, base = 3)
``````

2) recursive solution here is an alternative that works recursively. it computes the last letter of the appendix number and then removes it and recursively computes the portion to its left.

``````app2r <- function(number, base = 26, suffix = "") {
number1 <- number - 1
last_digit <- number1 %% base
rest <- number1 %/% base
suffix <- paste0(letters[last_digit + 1], suffix)
if (rest > 0) recall(rest, base, suffix) else suffix
}

# tests
identical(sapply(1:29, app2r), sapply(1:29, app2))
## [1] true
identical(sapply(1:60, app2r, base = 3), sapply(1:60, app2, base = 3))
## [1] true
``````
By Nanthini Muniapan on April 14 2022