is there a way to extend LETTERS past 26 characters e.g., AA, AB, AC...?

You can make what you want like this:

LETTERS2<-c(LETTERS[1:26], paste0("A",LETTERS[1:26]))

Another solution for excel style column names, generalized to any number of letters

#' Excel Style Column Names
#'
#' @param n maximum number of letters in column name
excel_style_colnames <- function(n){
  unlist(Reduce(
    function(x, y) as.vector(outer(x, y, 'paste0')),
    lapply(1:n, function(x) LETTERS),
    accumulate = TRUE
  ))
}

Would 702 be enough?

LETTERS702 <- c(LETTERS, sapply(LETTERS, function(x) paste0(x, LETTERS)))

If not, how about 18,278?

MOAR_LETTERS <- function(n=2) {
  n <- as.integer(n[1L])
  if(!is.finite(n) || n < 2)
    stop("'n' must be a length-1 integer >= 2")

  res <- vector("list", n)
  res[[1]] <- LETTERS
  for(i in 2:n)
    res[[i]] <- c(sapply(res[[i-1L]], function(y) paste0(y, LETTERS)))

  unlist(res)
}
ml <- MOAR_LETTERS(3)
str(ml)
# chr [1:18278] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" ...

This solution uses recursion. Usage is a bit different in the sense MORELETTERS is not a long vector you will have to store and possibly expand as your inputs get larger. Instead, it is a function that converts your numbers into the new base.

extend <- function(alphabet) function(i) {
   base10toA <- function(n, A) {
      stopifnot(n >= 0L)
      N <- length(A)
      j <- n %/% N 
      if (j == 0L) A[n + 1L] else paste0(Recall(j - 1L, A), A[n %% N + 1L])
   }   
   vapply(i-1L, base10toA, character(1L), alphabet)
}
MORELETTERS <- extend(LETTERS)         

MORELETTERS(1:1000)
# [1] "A" "B" ... "ALL"
MORELETTERS(c(1, 26, 27, 1000, 1e6, .Machine$integer.max))
# [1] "A"       "Z"       "AA"      "ALL"     "BDWGN"   "FXSHRXW"

Tags:

R