【问题标题】:Why R order files as 1 10 100 not 1 2 3? [duplicate]为什么 R 将文件订购为 1 10 100 而不是 1 2 3? [复制]
【发布时间】:2012-05-28 14:42:11
【问题描述】:

可能重复:
R sorts a vector on its own accord - bad boy!
How can I read the files in a directory in sorted order using R?

下面给出的代码运行良好。但是,问题是当我输入 dir1 来查看结果时,我发现 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)
} 

【问题讨论】:

    标签: r


    【解决方案1】:

    因为它不解释数字 - 而是对字符串进行排序

    【讨论】:

    • 就像其他所有东西一样:)
    • 它没有坏,没有什么可修复的!! :) 您可以更改文件的命名以填充数字,即 data0001.flt、data0002.flt、data0003.flt - 这将符合字符串排序规则。
    • 我重命名了您建议的文件,但这并没有解决问题。
    • 什么意思,它不起作用?如果您查看您发布的数据,那是从 data101.flt 正确排序的 - 您做了哪些不同的事情?
    【解决方案2】:

    如果您知道文件名称的结构,则可以使用它而不是直接从 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 是在 2.15 中引入的 - 我进行了编辑以添加旧版本的替代方案。但实际上,这只是构造文件名的基本文本操作。
    • 但我想知道为什么文件仍然没有排序 setwd("C:\\Users\\Amin\\Desktop\\2001") for(i in seq(365)){ filename
    • ... 文件名仍然排序。你应该对那里的文件名做一些事情。循环每次都会覆盖“文件名”,因此您最终会得到最后一个,它恰好是 data365.flt。我添加了另一个编辑以希望澄清这一点......
    猜你喜欢
    • 2010-12-22
    • 2019-01-09
    • 2017-07-10
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 2015-04-08
    相关资源
    最近更新 更多