получить исходное имя файла загруженного объекта данных в R - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь получить исходное имя файла объекта, хранящегося в R. Причина в том, что после внесения изменений в объект данных я хочу сохранить новый объект, используя тот же префикс в имени файла.Вот что я имею в виду:

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

Сделайте несколько анализов dat, чтобы сделать dat.new и сохраните файл, используя оригинальный префикс:

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

Я пытаюсьИзбегайте ручного изменения имени файла каждый раз, когда я загружаю другой CSV-файл.Я надеюсь, что это имеет смысл, и есть простое решение!

Ответы [ 3 ]

1 голос
/ 20 сентября 2019

Вы можете попробовать что-то вроде этого:

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")
1 голос
/ 20 сентября 2019

Самый быстрый способ сделать это, вероятно, использовать gsub().

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

Вот результаты rbenchmark, хотя я хочу отметить, что вычислительное время между этими тремяметоды практически ничтожны, если вы выполняете этот код менее 1000 раз.

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
1 голос
/ 20 сентября 2019

Самый простой способ - это что-то вроде:

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)
...