我有以下字符串:
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}}}}"
如何保持{代替他们?
答案 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()
一起把它全部打回来。