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