Как сортировать буквы в строке?

Скажем, у меня есть строка s = "bcabca".

Каков самый простой способ получить из него "aabbcc", т.е. отсортировать буквы в s?

Ответы

Ответ 1

Возможно, не самый простой ответ, но это будет работать:

paste(sort(unlist(strsplit(s, ""))), collapse = "")

Или измените функцию strReverse, определенную на странице справки ?strsplit, в соответствии с нашими потребностями. Назовем его strSort:

strSort <- function(x)
        sapply(lapply(strsplit(x, NULL), sort), paste, collapse="")

Ответ 2

Здесь вариант решения Chase, который обрабатывает вектор строк и сохраняет исходные строки как имена.... и я получаю возможность продвигать использование vapply над sapply: -)

> x=c('hello', 'world', NA, 'a whole sentence')
> vapply(x, function(xi) paste(sort(strsplit(xi, NULL)[[1]]), collapse=''), '')
             hello              world               <NA>   a whole sentence 
           "ehllo"            "dlorw"                 "" "  aceeeehlnnostw" 

Ответ 3

Возможно, было бы неплохо упомянуть пакет stringi для этой проблемы. Функции stri_order и stri_sort очень эффективны, тестирование в половине времени базового метода R, упомянутого выше.

library(stringi)
## generate 10k random strings of 100 characters each
str <- stri_rand_strings(1e4, 100)
## helper function for vapply()
striHelper <- function(x) stri_c(x[stri_order(x)], collapse = "")
## timings
system.time({
  v1 <- vapply(stri_split_boundaries(str, type = "character"), striHelper, "")
})
#    user  system elapsed 
#   0.747   0.000   0.743 

system.time({
  v2 <- sapply(lapply(strsplit(str, NULL), sort), paste, collapse="")
})
#    user  system elapsed 
#   2.077   0.000   2.068 

identical(v1, v2)
# [1] TRUE

Ответ 4

Повторяя это, мой старый ответ был не так хорош. Здесь лучшая версия с base функциями:

vapply(strsplit(x, NULL), function(x) paste(sort(x), collapse = ''), '')

Исходя из этого тестового вектора:

NN = 1000000L
starts = seq(1L, NN, by = 100L)
name = 
  substring(paste(sample(letters, size = NN, replace = TRUE), collapse = ""),
            starts, starts + 99L)