R переименовывает столбцы во многих CSV - PullRequest
1 голос
/ 30 января 2020

У меня есть 200 csvs с теми же двумя столбцами (дата и уровень). Тем не менее, столбцы в настоящее время не имеют имен. Все они должны иметь одинаковые имена столбцов для пакета, который я использую в R. Есть ли способ l oop через все CSV и дать им все имена столбцов (одинаковые имена столбцов, дату и уровень)? Я новичок в R и не имею большого опыта написания циклов.

Например, в настоящее время данные в каждом CSV выглядят так:

09/21/1299 | 23
09/22/1999 | 25
09/23/1999 | 25

, но я бы хотел, чтобы выглядеть так:

date       | level
09/21/1299 | 23
09/22/1999 | 25
09/23/1999 | 25

Ответы [ 4 ]

0 голосов
/ 30 января 2020

Я предполагаю, что вы не просто хотите читать файлы, но на самом деле модифицируете файлы так, чтобы они содержали заголовки столбцов.

Чтобы следующий код работал, вам нужно определить две переменные: path должен указывать на папку, в которой хранятся исходные файлы. out_path должен быть путь к папке, где должны храниться измененные файлы. Если папка out_path не существует, она будет создана.

Этот фрагмент кода читает все файлы csv в path, добавляет заголовки и записывает измененные файлы в папку out_path:

# create the output folder
# showWarnings = FALSE ensures that the function does not complain,
# even if the folder already exists
dir.create(out_path, showWarnings = FALSE)

# get the names of the input files with their full path
files <- list.files(path, "\\.csv", full.name = TRUE)

# loop through all the input files
for (file in files) {

  # read the file, specify the correct separator
  data <- read.table(file, sep = "|")

  # set the column names
  names(data) <- c("date", "level")

  # define the output file name: the file should be written to
  # out_path and have the same name as the original file
  outfile <- file.path(out_path, basename(file))

  # write the file. You need to specify the separator (|), and
  # omit row names and quotes
  write.table(data, outfile, sep = "|", row.names = FALSE, quote = FALSE)
}

Файл примера из вашего вопроса будет преобразован в:

date|level
09/21/1299 |23
09/22/1999 |25
09/23/1999 |25

Обратите внимание, что заголовки неправильно выровнены. Если файлы читаются как файлы CSV, это не должно быть проблемой.

0 голосов
/ 30 января 2020

В следующем коде измените wanted_colnames, который вы хотите присвоить всем столбцам. Этот код (с исправлениями, если требуется) должен прочитать все csv внутри папки files_folder (измените его, чтобы указать полный путь). Наконец вы можете rbind_fill / rbindlist на dfs, чтобы получить полный фрейм данных.

wanted_colnames <- c('var1', 'var2', 'var3')
files_folder <- '/files/folder/path'

docs <- list.files(files_folder)
dfs <- list()
for(doc in docs) {
   full_path <- file.path(files_folder, doc)
   dfs[doc] <- read.csv(full_path)
   names(dfs[doc]) <- wanted_colnames
}
0 голосов
/ 30 января 2020

Для доступа ко всем файлам в папке вы можете использовать list.files, затем вы можете прочитать каждый из них с помощью read.csv, и, наконец, вы должны записать их в новые файлы с помощью write.csv.

В целом вы будет иметь код, подобный следующему:

files <- list.files("path/to/directory/")
sapply(files, function(file){
                      x <- read.csv(file)
                      colnames(x) <- c("Col1", "Col2")
                      write.csv(paste0("new_", file),x)
}
0 голосов
/ 30 января 2020
  1. Используйте list.files(path = "./", pattern = "*.csv)) для получения имен всех файлов CSV
  2. Создайте al oop, где вы:
    • читаете в каждом файле
    • назначаете имена столбцов во фрейм или матрицу данных
    • записать в новый файл (или перезаписать оригинал)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...