如何在R中按字母顺序排序?
Posted
技术标签:
【中文标题】如何在R中按字母顺序排序?【英文标题】:How to sort alphabetically in R? 【发布时间】:2014-04-18 18:34:23 【问题描述】:我的文件格式为:
ada1
ada2
ada3
....
ada10
ada11
ada12
不幸的是,当我写出 a10 时,a11 和 a12 出现在 a2 之前。你能帮我按字母顺序排序吗?
#编辑
现在,我有数千个这样的文件。基本上就是xyz1-12、abc1-12等
我使用以下方法获取所有文件:
GG <- grep("*.txt", list.files(), value = TRUE)
所以我不能手动输入“ada”。
【问题讨论】:
是否可以重命名示例中的文件? 您显示的不是字母排序。您可以使用 gtools 包中的mixedsort
。
我不想重命名实际文件。
【参考方案1】:
如果总是有三个字符,您可以按这些字符独立排序,然后对字符串的其余部分进行数字排序:
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"
【讨论】:
我使用 GG 您能解释一下吗?我没明白。谢谢 对不起,我误读了您的评论。我在表达式中替换了GG
。听起来这就是你想要的。
对不起,我可能没有正确解释。这不是我想要的。基本上,GG 给了我文件夹中所有我想要排序的文件的名称。我不想像你一样手动插入'ada','xyz'。我怎么能做到?谢谢
谢谢。混合排序很简单。【参考方案2】:
使用包gtools
的另一种方式:
require(gtools)
x <- paste0('a', 1:12)
mixedsort(x)
[1] "a1" "a2" "a3" "a4" "a5" "a6" "a7" "a8" "a9" "a10" "a11" "a12"
【讨论】:
谢谢。我添加了一些信息。我无法手动添加,因为我有数千个文件。如何调整您的代码? 我不明白你为什么不能只使用mixedsort(GG)
。
@GeekunaMatata 他只是创建了一组“测试”名称。只需在您的文件名集合上运行 mixedsort
。【参考方案3】:
如果您不能将它们的名称更改为更好的名称(即 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
您可以修改此过程以适应不同数量的字母,使用正则表达式来查找拆分。
【讨论】:
【参考方案4】:如果您可以更改文件名,您可以执行以下操作:
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
,重命名所有文件非常容易。
【讨论】:
以上是关于如何在R中按字母顺序排序?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 swift 中按字母顺序对 JSON 字符串进行排序?