有条件地将字符添加到字符串

时间:2019-02-21 01:31:36

标签: r string

我试图在字符串中添加0,但仅在某些条件下。

我有一个像这样的文件名向量:

my.fl <- c("res_P1_R1.rds", "res_P2_R1.rds",
  "res_P1_R19.rds", "res_P2_R2.rds",
  "res_P10_R1.rds", "res_P10_R19.rds")

我想sort(my.fl)以便文件名按PR之后的数字排序,但按这样的顺序排序:

 "res_P1_R1.rds"   "res_P1_R19.rds"  "res_P10_R1.rds"  "res_P10_R19.rds" "res_P2_R1.rds"   "res_P2_R2.rds" 

要解决此问题,我需要在PR之后添加0,但是仅当以下数字在1-9范围内时,如果以下数字是> 9,我想什么都不做。

结果应如下:

"res_P01_R01.rds"   "res_P01_R19.rds"  "res_P10_R01.rds"  "res_P10_R19.rds" "res_P02_R01.rds"   "res_P02_R02.rds"

如果我将其排序,则按预期顺序进行排序,例如:

"res_P01_R01.rds" "res_P01_R19.rds" "res_P02_R01.rds" "res_P02_R02.rds" "res_P10_R01.rds" "res_P10_R19.rds"

我可以基于位置添加0,但是由于所需的位置更改,我的解决方案仅适用于文件名的子集。我认为这将是一个普遍的问题,但是我还没有找到关于SO(或任何地方)的答案,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您应该能够只使用mixedsort包中的gtools,从而无需插入零。

my.fl <- c("res_P1_R1.rds", "res_P2_R1.rds",
           "res_P1_R19.rds", "res_P2_R2.rds",
           "res_P10_R1.rds", "res_P10_R19.rds")

library(gtools)

mixedsort(my.fl)

[1] "res_P1_R1.rds"   "res_P1_R19.rds"  "res_P2_R1.rds"   "res_P2_R2.rds"   "res_P10_R1.rds"  "res_P10_R19.rds"

但是,如果您确实想插入零,则可以使用类似以下内容的

sort(gsub("(?<=\\D)(\\d{1})(?=\\D)", "0\\1", my.fl, perl = TRUE))

[1] "res_P01_R01.rds" "res_P01_R19.rds" "res_P02_R01.rds" "res_P02_R02.rds" "res_P10_R01.rds" "res_P10_R19.rds"