Как отсортировать буквы в строке? - PullRequest
21 голосов
/ 06 мая 2011

Допустим, у меня есть строка s = "bcabca".

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

Ответы [ 4 ]

26 голосов
/ 06 мая 2011

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

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

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

strSort <- function(x)
        sapply(lapply(strsplit(x, NULL), sort), paste, collapse="")
18 голосов
/ 06 мая 2011

Вот вариант решения Чейза, который обрабатывает вектор строк и сохраняет исходные строки как имена. ... и я получаю шанс продвигать использование 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" 
7 голосов
/ 20 февраля 2015

Было бы хорошо упомянуть пакет stringi для этой проблемы. Его функции stri_order и stri_sort очень эффективны, тестирование выполняется в два раза быстрее, чем метод base 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
3 голосов
/ 19 февраля 2015

Возвращаясь к этому, мой старый ответ не был так хорош. Вот лучшая версия с 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...