Устранить строки Excel в R на основе ячеек с заданным форматированием (например, зачеркивание)? - PullRequest
0 голосов
/ 27 февраля 2019

Как я могу исключить строки Excel в R, если определенный тип форматирования характеризует ячейку (например, зачеркивание)?В частности, я хочу исключить строки, чья ячейка в столбце 1 имеет зачеркнутое форматирование («зачеркнутый»).Используя функции dplyr::join() в сочетании с readxl::read_xlsx(), я мог бы также работать только с вектором ячеек в столбце 1, содержащем поразительные значения.

Похоже, пакет tidyxl - это путь.Применяя ответ @Wimpel к этому SO вопросу , о обнаружении стиля зачеркивания, я до сих пор имею:

xlfile <- 'PATH TO .XLSX FILE' 
xlin <- xlsx_cells(xlfile)
formats <- tidyxl::xlsx_formats(xlfile)
cells   <- tidyxl::xlsx_cells(xlfile, sheets = 1)
strike <- which( formats$local$font$strike )
strike_cells <- cells[ cells$local_format_id %in% strike, 2 ]
nostrike_cells <- cells[ !cells$local_format_id %in% strike, 2 ]

xl_new <- anti_join(xlin, strike_cells)

Однако я пока не знаюзнать, как добраться оттуда ( снимок экрана ниже ) во фрейм данных без исключенных ячеек.tidyxl dataframe after anti_join, so sans excluded cells

Виньетка tidyxl описывает полезное предотвращение приведения кадров в пакет, но у меня возникли проблемы с созданием окончательного кадра данных.

Возможно, у кого-то есть решение, использующее tidyxl или другой пакет R, такой как openxlsx?

1 Ответ

0 голосов
/ 27 февраля 2019

Следующее используется tidyxl и dplyr для чтения + обработки, а затем openxlsx для записи файла Excel.

Короче говоря, tidyxl функции xlsx_formats и xlsx_cells используются для идентификации ячеек с зачеркнутым форматированием, а затем другие строки записываются как числовой вектор с dplyr::pull() (объект nostrike_rows_vector),Затем dplyr::slice() захватывает только те строки, которые определены nostrike_rows_vector.

library(tidyxl)
library(dplyr)
library(openxlsx)
xlfile <- 'PATH TO .XLSX FILE' 
xlin <- xlsx_cells(xlfile)
formats <- xlsx_formats(xlfile)
cells   <- xlsx_cells(xlfile, sheets = 1)
strike <- which( formats$local$font$strike )
strike_cells <- cells[ cells$local_format_id %in% strike, 2 ]
strike_rows <- inner_join(strike_cells, cells) %>%
    distinct(row) 
nostrike_rows_vector <- anti_join(cells, strike_rows) %>%
    distinct(row) %>%
    # Do not consider header row
    # Remember this code only works if the first row is a header row
    dplyr::filter(row != 1) %>%
    # tidyxl xlsx_formats and xlsx_cells functions treat row 1 as header
    mutate(row = row - 1) %>%
    pull(row)
xlout <- xlin %>% 
           slice(nostrike_rows_vector)
write.xlsx(xlout, "cleaned_excel_file.xlsx")

Примечания:

  1. Этот код R предполагает, что файл Excel имеет заголовокстрока (т. е. строка 1 задает имена столбцов), которую вы хотите сохранить.
  2. Пустые ячейки также обрабатываются как ячейки с зачеркнутым форматированием.Это хорошо для моего варианта использования, но я предлагаю выборочную проверку, чтобы обеспечить желаемые результаты.
...