按特定值对字符串进行排序

时间:2015-09-01 17:58:14

标签: r string list sorting

我有以下字符串:

str1<-"{a{c}{b{{e}{d}}}}"

另外,我有一个整数列表:

str_d <- ( 1, 2, 2, 4, 4)

列表与字符串之间存在一对一的关系。 这意味着:

a 1
c 2
b 2
e 4
d 4

我想按字母顺序排序只有str1具有相同级别的字符。 这意味着对c,b(具有相同的值2)进行排序将产生b,c 并且对e,d(具有相同的值4)进行排序将产生d,e。

所需的结果将是:

str2<-"{a{b}{c{{d}{e}}}}"

此外,a,b,c,d和e不仅可以是字符,还可以是单词,例如:

str1<-"{NSP{ARD}{BOS{{DUD}{COR}}}}"

如何保持{代替他们?

2 个答案:

答案 0 :(得分:3)

brkts <- gsub("\\w+", "%s", str1)
strings <- regmatches(str1,gregexpr("[^{}]+",str1))[[1]]
fixed <- ave(strings, str_d, FUN=function(x) sort(x))
do.call(sprintf, as.list(c(brkts, fixed)))
[1] "{a{b}{c{{d}{e}}}}"

[1] "{NSP{ARD}{BOS{{COR}{DUD}}}}"

它适用于第一种和第二种情况。我们首先将文字与gsub隔离,然后放置%s。稍后将用于sprintf。接下来,我们通过在每组括号之后放置的逗号上使用strsplit分割来隔离字符串。然后,我们根据给定的排序向量进行排序,并将字符保存在向量fixed中。最后,我们在开头创建的sprintf变量和排序后的字符串上调用brkts

数据

str_d <- c(1, 2, 2, 4, 4)
str1<-"{a{c}{b{{e}{d}}}}"
str1<-"{NSP{ARD}{BOS{{DUD}{COR}}}}"

答案 1 :(得分:1)

一种可能的解决方案(使用stringr包):

words <- str_extract_all(str1, '\\w+')[[1]]
ordered <- words[order(paste(str_d, words))]
formatter <- str_replace_all(str1, '\\w+', '%s')
do.call(sprintf, as.list(c(formatter, ordered)))

words是大括号之间的单词的摘录。我通过用str_d对单词的组合进行排序来对这些进行排序。例如。这些话将成为:

1 a 
2 c
2 b 
4 e 
4 d

然后我和sprintf()一起把它全部打回来。