Как мне разобрать и извлечь неопрятные данные Excel? - PullRequest
0 голосов
/ 17 февраля 2019

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

В частности, для каждого файла Excel, для каждого листа мне нужно иметь 2 фрейма данных (один содержит таблицу, а второй содержит все заголовки).Для каждого листа макет одинаков (одинаковые заголовки, одна и та же таблица)

Я НЕ ДОЛЖЕН использовать строки для разделения заголовков, а только имена символов.

Как его разделить?

enter image description here

  • Заголовки: заголовок, страницы, копии, год, конец.Первые четыре - на 3 строки выше таблицы, конец - на 2 строки ниже.
  • В таблице 5 столбцов: id, глюкоза, инсулин, crp, ffa.
  • В таблице 4 строки(5, если вы включили имена столбцов выше)
  • Заголовки должны быть такими же, как в последнем df: title: one, pages: many, copy: 200, year: 2019, end: after.
  • В настоящее время заголовки и соответствующие значения существуют не в одной и той же ячейке, а в соседних ячейках.

Я сделаю все возможное, чтобы дать дополнительные разъяснения, если их попросят.

У меня уже есть код для их записи в виде csv после синтаксического анализа, и все готово.

У меня уже есть функция, которая разбивает таблицы Excel.

Теперь мне нужно толькоразделить на 2 фрейма данных.

Я пытался использовать tidyxl, но по какой-то причине файл не открывается.В нем говорится, что существует error("zip file cannot be opened"), однако файл не является zip-файлом, это xlsx, который я только что создал.

Я пробовал фильтровать по символам, но он не работал (или я не смог

#file.choose()
my_path <- "C:\\Users\\Βύρωνας\\Desktop\\BYRON\\Miscellaneous\\test.xlsx"
cel <- xlsx_cells(path = my_path, sheets = Sheet1) #doesn't work
cells <- readxl::read_excel(my_path, col_names = F)

cells <- as_cells(cells)
rectify(cells, character, numeric)
str(cells)

#idea: which row and which columns have the top_left and bottom_right?
corners <- 
filter(cells, !is.na(character),
     !(character %in% c("title", "pages", "copies", "year", "end")))

partition(cells, corners)

#if it doesn't work, use subset? or find the row that contains the end and 
#get the inbetween space?

Если это поможет, вот код (он работает) для импорта и разбиения листов:

library(readxl)
read_excel_allsheets <-function(filename, tibble = FALSE) {
sheets <- readxl::excel_sheets(filename)
x <- lapply(sheets, function(X) readxl::read_excel(filename, sheet = X))
 if(!tibble) 
  x <-lapply(x, as.data.frame)
  names(x) <- sheets
x
}

За это время я достиг этогоfar:

sheet <- 1
read1 <- readxl::read_excel(my_path, sheet = sheet)

skip_rows <- NULL
col_skip <- 0
search_string1 <- "id"
search_string2 <- "end"
max_cols_to_search <- 6
max_rows_to_search <- 20

while (length(skip_rows) == 0) {
  col_skip <- col_skip + 1
  if (col_skip == max_cols_to_search) break
  skip_rows <- 
which(stringr::str_detect(read1[1:max_rows_to_search,col_skip][[1]],
                                     search_string1)) - 0

}


read2 <- readxl::read_excel(
  my_path,
  sheet = sheet,
  skip = skip_rows
)

Это помогает мне избавиться от верхних заголовков, и это хорошо, но я все еще не могу избавиться от нижних.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...