Мне нужно создать функцию, которая анализирует и разделяет неопрятные данные Excel и в конечном итоге сохраняет их в виде CSV-файлов.
В частности, для каждого файла Excel, для каждого листа мне нужно иметь 2 фрейма данных (один содержит таблицу, а второй содержит все заголовки).Для каждого листа макет одинаков (одинаковые заголовки, одна и та же таблица)
Я НЕ ДОЛЖЕН использовать строки для разделения заголовков, а только имена символов.
Как его разделить?

- Заголовки: заголовок, страницы, копии, год, конец.Первые четыре - на 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
)
Это помогает мне избавиться от верхних заголовков, и это хорошо, но я все еще не могу избавиться от нижних.