【问题标题】:R regexp for odd sorting of a char vectorR 正则表达式用于对 char 向量进行奇数排序
【发布时间】:2020-04-26 09:17:12
【问题描述】:

我有数百个文件需要以复杂的方式对其列进行排序。想象一个字符向量x,它是names(foo) 的结果,其中foodata.frame

x <- c("x1","i2","Component.1","Component.10","Component.143","Component.13",
       "r4","A","C16:1n-7")

我想根据以下规则对其进行排序:首先,任何以“组件”开头的内容都按字母顺序排列。其次,以“C”和数字开头的任何剩余内容按字母顺序排列。剩下的所有内容按字母顺序排在第三位。

对于x,那就是:

x[c(3,4,6,5,9,8,2,7,1)]

这是regexp 类型的任务吗?有人使用match 吗?每个文件将有不同数量的列(因此x 将具有不同的长度)。任何提示表示赞赏。

【问题讨论】:

  • 有疑问,Component 的值不应该正确排序,即"Component.1" "Component.10" "Component.13" "Component.143" 还是只是按照出现的顺序排序
  • 哎呀。是的。你是对的。

标签: r regex sorting


【解决方案1】:

您可以使用来自base-r 的函数order 来实现:

x <- c("x1","i2","Component.1","Component.10","Component.143","Component.13",
       "r4","A","C16:1n-7")    
order(
    !startsWith(x, "Component"), # 0 - starts with component, 1 - o.w.
    !grepl("^C\\d", x),          # 0 - starts with C<NUMBER>, 1 - o.w.
    x                            # alphabetical
)
# output: 3 4 6 5 9 8 2 7 1

【讨论】:

    【解决方案2】:

    仅使用基础 R 的蛮力解决方案:

    first = sort(x[grepl('^Component', x)])
    second = sort(x[grepl('^C\\d', x)])
    third = sort(setdiff(x, c(first, second)))
    c(first, second, third)
    

    【讨论】:

      【解决方案3】:

      我们可以将int拆分成不同的元素,然后使用mixedsort from gtools

      v1 <-  c(gtools::mixedsort(grep("Component", x, value = TRUE)), 
        gtools::mixedsort(grep("^C\\d+", x, value = TRUE)))
      c(v1, gtools::mixedsort(x[!x %in% v1]))
      #[1] "Component.1"   "Component.10"  "Component.13"  "Component.143" "C16:1n-7"      "A"             "i2"            "r4"           
      #[9] "x1"   
      

      或者select 中的另一个选项,假设这些是 data.frame 的列

      library(dplyr)
      df1 %>%
        select(mixedsort(starts_with('Component')), 
             mixedsort(names(.)[matches("^C\\d+")]), 
             gtools::mixedsort(names(.)[everything()]))
      

      如果只是出现的顺序

      df1 %>% 
        select(starts_with('Component'), matches('^C\\d+'), sort(names(.)[everything()]))
      

      数据

      set.seed(24)
      df1 <- as.data.frame(matrix(rnorm(5 * 9), ncol = 9,
               dimnames = list(NULL, x)))
      

      【讨论】:

      • 您的第三个正则表达式将省略以 C 开头但与前两个不匹配的字符串,例如“Cxx”。
      猜你喜欢
      • 2017-09-20
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      相关资源
      最近更新 更多