R: Чтение нескольких файлов Excel в разные фреймы данных и одновременное их изучение - PullRequest
0 голосов
/ 04 июля 2019

Я пишу код R для преобразования 400 файлов Excel в простые для чтения машиной плоские файлы. При получении этих файлов Excel наступает сжатый срок, и нет возможности получить исходные файлы в машиночитаемом формате.

У меня есть R-код, который будет извлекать данные в нужных нам строках и столбцах, удалять пробелы и красиво представлять их в формате MR. Проблема, которую мне нужно решить сейчас, заключается в том, что мне нужно подтвердить, что каждый из 400 файлов имеет правильный формат для правильной работы функции. Для этого я просто хочу проверить множество простых вещей, например, что столбец 'title' находится в ячейке A9 в каждом из файлов Excel.

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

Самое близкое, что у меня есть, это:

template_dir <- "file path of main directory"
files <- list.files(path=template_dir, pattern="*.xlsx", full.names=TRUE, recursive=TRUE) 
df.files <- lapply (files, read_excel)

Затем генерируется список из 400 элементов. Я могу загрузить каждый из них по отдельности без проблем с

df.files [1]

Но, если я попытаюсь использовать:

title_loc <- which (df.files [1] == "Title", arr.ind = TRUE)

Это не работает, я просто получаю пустое значение. Я знаю, что функция 'which' работает, хотя, когда я просто читаю один файл Excel в R как df (или помещаю путь к файлу), тогда функция 'which' работает нормально и возвращает [1,9] как ожидается.

400 файлов распределены по нескольким папкам (с этим я тоже ничего не могу поделать), и я могу получить список всех файлов, используя list.files. Я хочу выполнить серию простых проверок (ссылка для «title»; ссылка для «age»; ссылка для «location» и т. Д.), Чтобы подтвердить, что все 400 файлов размещены одинаково. Таким образом, было бы идеально перечислить выходные данные для 'title' в одном df, чтобы я мог затем проверить, что столбец равен '1' для всех 400, а строка '9' для всех 400.

Я думаю, что я хочу это:

title_loc <- which (*loop to cycle through every element in df.files* == "Title", arr.ind = TRUE)

Но способ написания циклов побеждает меня. Будет ли проще получить путь к файлу для всех 400 файлов Excel в списке, а затем просто прокрутить их (вместо использования lapply для импорта всех данных)?

Спасибо

1 Ответ

0 голосов
/ 04 июля 2019

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

# load names of excel files 
files = list.files(path = "C:\\your_path_here\\", full.names = TRUE, pattern = ".xlsx")

# create function to read multiple sheets per excel file
read_excel_allsheets <- function(filename, tibble = FALSE) {
  sheets <- readxl::excel_sheets(filename)
  sapply(sheets, function(f) as.data.frame(readxl::read_excel(filename, sheet = f)), 
         simplify = FALSE)
}

# execute function for all excel files in "files"
all_data <- lapply(files, read_excel_allsheets)

Или

library(XLConnect)

testDir <- "C:\\your_path_here\\"

re_file <- ".+\\.xls.?"
testFiles <- list.files(testDir, re_file, full.names = TRUE)

# This function rbinds in a single dataframe
# the content of multiple sheets in the same workbook
# (assuming that all the sheets have the same column types)
rbindAllSheets <- function(file) {
  wb <- loadWorkbook(file)
  sheets <- getSheets(wb)
  do.call(rbind,
          lapply(sheets, function(sheet) {
            readWorksheet(wb, sheet)
          })
  )
}

# Getting a single dataframe for all the Excel files
result <- do.call(rbind, lapply(testFiles, rbindAllSheets))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...