4

我的文件是:

CT.BP.50.txt
CT.BP.200.txt
CT.BP.500.txt 
GP.BP.50.txt
GP.BP.200.txt 
GP.BP.500.txt 

files <- c("CT.BP.50.txt", "CT.BP.200.txt", "CT.BP.500.txt", "GP.BP.50.txt", "GP.BP.200.txt", "GP.BP.500.txt")

我想对它们执行特定的操作,我可以这样做:

for (i in 1:length(files)) {
    foo <- read.table(files[i])
    barplot(table(foo$V1), main = files[i])
}

但是 R 按以下顺序绘制它们:

“CT.BP.200.txt” “CT.BP.500.txt” “CT.BP.50.txt” “GP.BP.200.txt” “GP.BP.500.txt” “GP.BP. 50.txt"

我希望它们按排序顺序绘制:

“CT.BP.50.txt” “CT.BP.200.txt” “CT.BP.500.txt” “GP.BP.50.txt” “GP.BP.200.txt” “GP.BP. 500.txt"

如何对具有字母数字名称的对象进行排序?

4

3 回答 3

11

问题是它list.files()以标准(词法)排序顺序返回文件名,并且数字是逐位比较的,而不是作为数字的一部分。

files <- sort(c("Gen.Var_CT.BP.200.txt", "Gen.Var_CT.BP.500.txt", 
                "Gen.Var_CT.BP.50.txt", "Gen.Var_GP.BP.200.txt",
                "Gen.Var_GP.BP.500.txt", "Gen.Var_GP.BP.50.txt"))

在我的系统上,这给出了:

> files
[1] "Gen.Var_CT.BP.200.txt" "Gen.Var_CT.BP.50.txt"  "Gen.Var_CT.BP.500.txt"
[4] "Gen.Var_GP.BP.200.txt" "Gen.Var_GP.BP.50.txt"  "Gen.Var_GP.BP.500.txt"

该函数gtools::mixedsort将(通常)按您想要的方式排序:字符串中的一系列数字将被视为数字以进行排序。但是,您的示例存在一些问题,因为mixedsort假设.是数字的一部分,因此被.200.视为潜在数字,实际上不能将其排序为数字。由于您的示例中没有实际的小数点,因此您可以解决这个问题。

files <- files[mixedorder(gsub("\\.", " ", files))]

所以文件现在排序为:

> files
[1] "Gen.Var_CT.BP.50.txt"  "Gen.Var_CT.BP.200.txt" "Gen.Var_CT.BP.500.txt"
[4] "Gen.Var_GP.BP.50.txt"  "Gen.Var_GP.BP.200.txt" "Gen.Var_GP.BP.500.txt"
于 2012-04-13T16:29:10.487 回答
2

这能行吗?

files <- c("Gen.Var_CT.BP.50.txt", "Gen.Var_CT.BP.200.txt", "Gen.Var_CT.BP.500.txt",    "Gen.Var_GP.BP.50.txt", "Gen.Var_GP.BP.200.txt", "Gen.Var_GP.BP.500.txt"){
for (i in 1:length(files)) {
  b <- read.table(files[i])
  barplot(table(b$V1), main=files[i])
于 2012-04-13T16:07:46.693 回答
1

看起来您想按特定顺序按文件名的特定组成部分进行排序。

因此,我首先将文件名分解为其组件,例如:

filesmat=matrix(unlist(strsplit(files,split='\\.')),byrow=T,ncol=4)

然后提取要排序的列。

numbercomponent=as.numeric(filesmat[,3])

varname=filesmat[,1]

然后用类似的东西重新排序文件名

files=files[order(varname,numbercomponent)]

然后随心所欲地绘制。

于 2012-04-13T16:24:32.023 回答