Как переименовать несколько объектов в r? Или как объекты могут быть распознаны с "-" в их названии в r? - PullRequest
0 голосов
/ 04 апреля 2019

Я прочитал большое количество файлов CSV в R, и по глупости кадры данных были сохранены с символом «-» в их именах, например, «new-zealand_kba». Есть ли способ заменить "-" на "_" для большого количества объектов. Например, "new-zealand_kba" станет "new_zealand_kba".

В качестве альтернативы, есть ли способ чтения большого количества CSV-файлов, где «-» в именах их файлов заменяется на «_».

# reading in all the CSV files in the folder "Oceania"
path <- "C:/Users/Melissa/Desktop/Dissertation/DATA/Oceania/"
files <- list.files(path=path, pattern="*.csv")
for(file in files)
{
  perpos <- which(strsplit(file, "")[[1]]==".")
  assign(
    gsub(" ","",substr(file, 1, perpos-1)), 
    read.csv(paste(path,file,sep="")))
}

# merging all the CSV files with the same country
# is it this section of my code which wont run as new-zealand_red etc is not
# recognised properly.
new-zealand1<-full_join(new-zealand_red, new-zealand_kba, by = "Year")
new-zealand2<-full_join(new-zealand1, new-zealand_con, by = "Year")
new-zealand3<-full_join(new-zealand2, new-zealand_rep, by = "Year")

1 Ответ

1 голос
/ 04 апреля 2019

Вы используете assign для создания data.frames. Здесь вы можете изменить имя:

assign(
   gsub("-", "_", gsub(" ","",substr(file, 1, perpos-1))), 
   read.csv(paste(path,file,sep="")))

Однако назначьте, возможно, не лучший вариант, и, возможно, вам следует рассмотреть возможность хранения списка фреймов данных вместо каждого фрейма данных отдельно, например, как это (не проверено):

list_of_dataframes <- lapply(files, function(file) read.csv(paste(path,file,sep=""))))

Тогда все ваши фреймы данных будут находиться в list. Вы можете легко присвоить имена этому списку:

names(list_of_dataframes) <- gsub("[ -]", "_", gsub("\\.csv$", "", files)))

Если вы не хотите перечитывать свои данные и хотите переименовать существующие фреймы данных, вы можете сделать следующее:

 all_obj <- ls()
 for (old_name in all_aobj) {
    new_name <- make.names(old_name) ## get a syntactical correct name
    if (new_name != old_name) {
        assign(new_name, get(old_name))
        rm(old_name)
    }
 }

Примечание. Этот код также переименует действительные инфиксные операторы, такие как %||%, поэтому рекомендуется начинать с лучшего выбора all_obj.

...