Удалить строки Excel в R на основе ячеек с указанным форматированием (например, зачеркнутым)?

Как я могу удалить строки 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 после anti_join, поэтому ячейки без исключения

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

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


person Rick Pack    schedule 27.02.2019    source источник


Ответы (1)


Следующие использовали 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. Пустые ячейки также рассматриваются как ячейки с зачеркнутым форматированием. Это было хорошо для моего варианта использования, но я предлагаю выборочную проверку, чтобы гарантировать желаемые результаты.
person Rick Pack    schedule 27.02.2019