我试图在字符串中添加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)
以便文件名按P
和R
之后的数字排序,但按这样的顺序排序:
"res_P1_R1.rds" "res_P1_R19.rds" "res_P10_R1.rds" "res_P10_R19.rds" "res_P2_R1.rds" "res_P2_R2.rds"
要解决此问题,我需要在P
和R
之后添加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(或任何地方)的答案,非常感谢任何帮助。
答案 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"