【问题标题】:Sorting a string by specific values按特定值对字符串进行排序
【发布时间】:2015-11-27 01:44:12
【问题描述】:

我有以下字符串:

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

如何将 { 保持在原位?

【问题讨论】:

    标签: r string list sorting


    【解决方案1】:
    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}}}}"
    

    【讨论】:

    • 您也可以使用regmatches(str1,gregexpr("[^{}]+",str1))[[1]] 提取字符串,可能比拆分/子集更清晰。
    • 这样更直接。谢谢你。我也可以使用其中一个包,但我喜欢它保留在基础 R 中。
    【解决方案2】:

    一种可能的解决方案(使用 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()一起拍回去。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 2021-11-24
      • 2023-01-21
      • 1970-01-01
      • 2012-11-15
      相关资源
      最近更新 更多