如何对string中的字母进行sorting?
假设我有一个strings = "bcabca"
。
"aabbcc"
最简单的方法是什么,即sortings
的字母?
也许不是最简单的答案,但这将工作:
paste(sort(unlist(strsplit(s, ""))), collapse = "")
或者修改strReverse
的帮助页面中定义的strReverse
函数以满足我们的需要。 我们将其称为strSort:
strSort <- function(x) sapply(lapply(strsplit(x, NULL), sort), paste, collapse="")
这是Chase解决scheme的一个变体,它处理一个stringvector并将原始string保存为名称。 …我得到一个机会来推广使用sapply vapply 🙂
> 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"
提到这个问题的stringi
包可能是很好的。 它是stri_order
和stri_sort
函数是非常有效的,在上面提到的基本R方法的一半时间testing。
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
重温这个,我的旧回答不太好。 以下是base
function的更好的版本:
vapply(strsplit(x, NULL), function(x) paste(sort(DT$name), collapse = ''), '')
基于这个testing向量:
NN = 1000000L starts = seq(1L, NN, by = 100L) name = substring(paste(sample(letters, size = NN, replace = TRUE), collapse = ""), starts, starts + 99L)