2015-09-01 80 views
4

我有以下字符串:排序由特定值的字符串

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}}}}" 

如何我可以做到这一点,保持{在他们的位置?

回答

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中。最后,我们在brkts变量上调用sprintf,该变量是我们在开头创建的变量以及已排序的字符串。

数据

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

您可以用regmatches(str1,gregexpr(“[^ {}] +”,str1))[[1]]'提取字符串,可能比split/subset更清晰一些。 –

+0

这更直接。谢谢。我也可以使用其中一个软件包,但我喜欢这与基地R. –

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()它全部重新走到一起。