【问题标题】:R sort string by number insideR按里面的数字对字符串进行排序
【发布时间】:2015-07-19 14:00:13
【问题描述】:

我有一个要打开的文件名列表。格式如下。

'xxxxx_xxxxxx 00.02.xls'

第一个 00 表示年份,第二个 02 表示月份。

无论如何要先用年份索引而不是月份索引来排序这个列表。

【问题讨论】:

  • @JabberwockyDecompiler 语言是 R(来自标签)。

标签: r string sorting


【解决方案1】:

如果在两个年份数字之前总是有 13 个字符,那么您可以这样做(假设您的文件名向量称为 x):

x[order(substr(x,14,18))]

【讨论】:

  • 太棒了!我以后会记住这一点...但在我的情况下,文件名的长度可能会改变...
  • 您还在order 中使用正则表达式,这本质上是@plafort 答案的变体。例如:x[order(gsub("(\\d{2}.\\d{2})","\\1", x))].
  • 忘记删除字符串中不必要的部分。谢谢你抓。应该是x[order(gsub(".*(\\d{2}.\\d{2}).*","\\1", x))]
【解决方案2】:

如果文件名中的字符数量可能发生变化,正则表达式可能会为您找到年份和月份。我喜欢 stringr 包中的 str_match

library(stringr)
extract <- str_match(vec, "([0-9]{2})\\.([0-9]{2}).xls")
vec[order(rank(extract[,2]))]

这样,如果您决定按月订购一天,您可以将最后一行从 2 更改为 3

如果您希望年份递减,请将rev 添加到其中。像这样,vec[rev(order(rank(extract[,2])))]

str_match 的伟大之处在于它告诉您匹配的内容并为您放入括号中的标记创建列。然后,您可以像任何其他数据框一样对这些列进行子集化。

extract
     [,1]        [,2] [,3]
[1,] "07.02.xls" "07" "02"
[2,] "15.12.xls" "15" "12"
[3,] "01.02.xls" "01" "02"

示例

vec <- c("xxxxxxxx_xxxxxx 07.02.xls", "xxxxx_xxx 15.12.xls", "xxxxx_xxxxxx 01.02.xls")
extract <- str_match(vec, "([0-9]{2})\\.([0-9]{2}).xls")
vec[order(rank(extract[,2]))]
[1] "xxxxx_xxxxxx 01.02.xls"    "xxxxxxxx_xxxxxx 07.02.xls" "xxxxx_xxx 15.12.xls" 

#or reversed

vec[rev(order(rank(extract[,2])))]
[1] "xxxxx_xxx 15.12.xls"       "xxxxxxxx_xxxxxx 07.02.xls" "xxxxx_xxxxxx 01.02.xls" 

【讨论】:

    猜你喜欢
    • 2013-06-01
    • 2022-11-25
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2018-07-02
    • 2014-04-23
    • 2012-10-14
    • 2014-10-28
    相关资源
    最近更新 更多