我的文件格式为:
ada1
ada2
ada3
....
ada10
ada11
ada12
不幸的是,当我写出a10时,a11和a12出现在a2之前。你能帮我按字母顺序对它进行排序吗?
#修改
现在,我有成千上万的这些文件。基本上,xyz1-12,abc1-12等。
我使用以下内容获取所有文件:
GG <- grep("*.txt", list.files(), value = TRUE)
所以我不能手动输入'ada'。
答案 0 :(得分:2)
如果总有三个字符,您可以按这些字符独立排序,然后对字符串的其余部分进行数字排序:
GG <- paste0(c('ada', 'xyz'), 1:20) # Synthesis of data similar to what your command would give
使用带有多个参数的order
给出了向量的置换,然后通过该置换进行索引以所需的排序顺序返回数据:
GG[order(substring(GG, 1, 3), as.numeric(substring(GG, 4)))]
[1] "ada1" "ada3" "ada5" "ada7" "ada9" "ada11" "ada13" "ada15" "ada17" "ada19" "xyz2" "xyz4" "xyz6" "xyz8" "xyz10"
[16] "xyz12" "xyz14" "xyz16" "xyz18" "xyz20"
答案 1 :(得分:1)
使用包gtools
的另一种方式:
require(gtools)
x <- paste0('a', 1:12)
mixedsort(x)
[1] "a1" "a2" "a3" "a4" "a5" "a6" "a7" "a8" "a9" "a10" "a11" "a12"
答案 2 :(得分:1)
如果您无法将其名称更改为更好的名称(即ada001,ada002 ......),则可以创建双索引。我假设fnames
是带有文件名的向量,并且数字前面只有固定数量的字母。
alpha <- substr(fnames, 1, 3)
num <- as.integer(substr(fnames, 4, nchar(fnames)))
o <- order(alpha, num) ## that's your sorting vector
您可以修改此过程以使用正则表达式来容纳不同数量的字母以查找拆分。
答案 3 :(得分:0)
如果您可以更改文件名,则可以执行以下操作:
names0 <- paste0("a", 1:20)
temp <- strsplit(names0, "a")
ind <- sapply(temp, "[[", 2)
names1 <- paste0("a", sprintf("%03d", as.numeric(ind)))
> names1
[1] "a001" "a002" "a003" "a004" "a005" "a006"
[7] "a007" "a008" "a009" "a010" "a011" "a012"
[13] "a013" "a014" "a015" "a016" "a017" "a018"
[19] "a019" "a020"
您可能需要根据此answer调整对sprintf
的调用。
为了澄清一下,使用file.rename
,重命名所有文件会很容易。