如何对字符串中的字母进行排序?

Leo*_*Leo 22 sorting r

假设我有一个字符串s = "bcabca".

什么是"aabbcc"摆脱它的最简单方法,即对字母进行排序s

Cha*_*ase 28

也许不是最简单的答案,但这可行:

paste(sort(unlist(strsplit(s, ""))), collapse = "")
Run Code Online (Sandbox Code Playgroud)

或者修改strReverse帮助页面中定义的功能?strsplit以满足我们的需求.我们称之为strSort:

strSort <- function(x)
        sapply(lapply(strsplit(x, NULL), sort), paste, collapse="")
Run Code Online (Sandbox Code Playgroud)


Tom*_*mmy 18

这是Chase解决方案的变体,它处理字符串向量并将原始字符串保留为名称....我有机会推广使用vapply over 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" 
Run Code Online (Sandbox Code Playgroud)


Ric*_*ven 8

stringi提出这个问题的包可能会很好.这是stri_orderstri_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
Run Code Online (Sandbox Code Playgroud)