【问题标题】:retrieve original file name of loaded data object in R在R中检索加载的数据对象的原始文件名
【发布时间】:2019-09-20 18:14:00
【问题描述】:

我正在尝试检索存储在 R 中的对象的原始文件名。原因是在对数据对象进行修改后,我想在文件名中使用相同的前缀保存新对象。这就是我的意思:

dat <- read.csv("../DATA/Cats.2017.csv")

对 dat 进行大量分析以生成 dat.new 并使用原始前缀保存文件:

write.csv(dat.new, file="../DATA/Cats.2017.NEW.csv"

我试图避免每次加载另一个 csv 文件时手动更改文件名。我希望这是有道理的,并且有一个简单的解决方案!

【问题讨论】:

    标签: r object naming


    【解决方案1】:

    你可以试试这样的:

    file_path <- "path/to/my/file/tmm/1.file.csv"
    file_name <- basename(file_path)
    
    sp <- unlist(strsplit(file_name, '\\.'))
    file_prefix <- paste0(sp[-length(sp)], collapse = '.')
    new_file_name <- paste0(file_prefix, ".NEW.csv")
    

    【讨论】:

    • 效果很好。如果您能接受所有答案,我会接受。
    【解决方案2】:

    最快的方法可能是使用gsub()

    fileName <- '../DATA/Cats.2017.csv'
    dat <- read.csv(fileName)
    write.csv(dat, paste0(gsub('.csv', '.NEW.csv', fileName)))
    

    这里是rbenchmark 的结果,但我确实想指出,如果您运行此代码少于 1,000 次,这三种方法之间的计算时间几乎可以忽略不计。

    fileName <- "../DATA/Cats.2017.csv"
    rbenchmark::benchmark(
      'str_sub' = {
        newName <- paste0(stringr::str_sub(fileName, 1, -4), "NEW.csv")
      },
      'stringi' = {
        newName <- paste0(paste(unlist(stringi::stri_split_fixed(basename(fileName), ".", n = 3))[-3], collapse = "."), ".NEW.csv")
      },
      'gsub' = {
        newName <- paste0(gsub('.csv', '.NEW.csv', fileName))
      },
      replications = 100000
    )
    
         test replications elapsed relative user.self sys.self user.child sys.child
    3    gsub       100000    0.81    1.000      0.82        0         NA        NA
    1 str_sub       100000    1.10    1.358      1.10        0         NA        NA
    2 stringi       100000    1.67    2.062      1.67        0         NA        NA
    

    【讨论】:

    • 将我使用strsplit 更新的解决方案添加到基准测试中。
    【解决方案3】:

    最简单的方法可能是这样的:

    orig_name <- "../DATA/Cats.2017.csv"
    
    dat <- read.csv(orig_name)
    
    # your analysis here
    
    new_name <- paste0(stringr::str_sub(basename(orig_name), 1, -4), ".NEW.csv")
    
    write.csv(dat.new, new_name)
    

    【讨论】:

    • 效果很好,只是它留下了一个额外的“。”在 new_name 的末尾导致“Cats.2017..NEW.csv”
    猜你喜欢
    • 2022-11-30
    • 1970-01-01
    • 2019-03-18
    • 2021-12-27
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多