为什么R将文件排序为1 10 100而不是1 2 3?

3
下面给出的代码运行良好。但问题在于,当我输入dir1查看结果时,我发现R按以下顺序排序文件:
Possible Duplicate: R sorts a vector on its own accord - bad boy!
How can I read the files in a directory in sorted order using R?
[1] "data1.flt"   "data10.flt"  "data100.flt" "data101.flt"
[5] "data102.flt" "data103.flt" "data104.flt" "data105.flt"
[9] "data106.flt" "data107.flt" "data108.flt" "data109.flt"
[13] "data11.flt"  "data110.flt" "data111.flt" "data112.flt"
[17] "data113.flt" "data114.flt" "data115.flt" "data116.flt"
.
.
to
.
.
[357] "data91.flt"  "data92.flt"  "data93.flt"  "data94.flt"
[361] "data95.flt"  "data96.flt"  "data97.flt"  "data98.flt"
[365] "data99.flt"

这将导致错误的结果。 如何告诉R按顺序从1到365开始读取(我甚至使用了sort(dir1),但它们没有被排序)。 类似于:

[1] "data1.flt"   "data2.flt"  "data3.flt" "data4.flt"

不像:

[1] "data1.flt"   "data10.flt"  "data100.flt" "data101.flt"

这里是代码:

dir1 <- list.files("C:\\Users", "*.flt", full.names = TRUE)
results <- list()
for (.files in seq_along(dir1)){
    file2 <- readBin(dir2[.files], double(), size = 4, n = w * 67420, signed = TRUE)
    results[[length(results) + 1L]] <- file1[file1 != -9999]*10
}
for (i in seq_along(results)){
    fileName <- sprintf("C:\\New folder (2)\\NewFile%03d.bin", i)
    writeBin(as.integer(results[[i]]), fileName, size = 2)
} 
2个回答

7
因为它不会解释数字,而是对字符串进行排序。

1
就像其他大部分事物一样 :) - MilkyWayJoe
1
没有出现问题,不需要修复!! :) 您可以更改文件的命名方式,使数字填充,例如 data0001.flt、data0002.flt、data0003.flt - 这将符合字符串排序规则。 - Dave
我按照你的建议重新命名了文件,但这并没有解决问题。 - Sami Yemein
你的意思是它不工作了?如果你看一下你贴出来的数据,就会发现它是按照data101.flt正确排序的 - 你做了什么不同的事情呢? - Dave

4

如果你知道文件名的结构,可以使用它来代替直接从dir中获取它们。

for(i in seq(365)){
    filename <- paste0("data", i, ".flt")
    # Do some stuff with filename
}

paste0 是在 R 2.15 版本中引入的,所以对于旧版本,您需要使用以下方法:

for(i in seq(365)){
    filename <- paste("data", i, ".flt", sep = "")
    # Do some stuff with filename
}

由于你似乎有些困惑,下面进行进一步编辑。每次循环迭代时,文件名都会更新。你可以通过每次打印文件名来了解这一点。
for(i in seq(365)){
    filename <- paste("data", i, ".flt", sep = "")
    print(filename)
    # Do some stuff with filename
}

我遇到了错误:setwd("C:\Users\Amin\Desktop\2001") for(i in seq(365)){ filename <- paste0("data", i, ".flt") conne <- file(filename, "rb")
  • file1<- readBin(conne, double(), size=4, n=360*720, signed=TRUE)
  • file1[file1 != -9999] <- file1[file1 != -9999]*10
  • close(conne)
  • fileName <- sprintf("C:\Users\Amin\Desktop\New folder (11)\NewFile%d.bin", b)
  • writeBin(as.integer(file1), fileName, size = 2)} 错误:找不到函数"paste0"
- Sami Yemein
paste0是在2.15中引入的 - 我进行了编辑,以添加旧版本的替代方案。但实际上,这只是基本的文本操作,以构造文件名。 - Dason
但我想知道为什么文件还没有排序 setwd("C:\Users\Amin\Desktop\2001") for(i in seq(365)){ filename <- paste("data", i, ".flt", sep = "") } filename [1] "data365.flt" - Sami Yemein
文件名仍然是有序的。你应该在那里对文件名进行一些操作。循环每次都会覆盖'filename',因此最终只剩下最后一个文件名,这恰好是data365.flt。我添加了另一个编辑,希望能澄清这一点... - Dason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接