当一种特殊的格式表示单元格(例如删除线)时,如何消除R中的Excel行?
我特别想消除第1列的单元格具有删除线格式(“ struckthrough”)的行。结合使用dplyr::join()
函数和readxl::read_xlsx()
,我还可以只处理第1列中包含删除线值的单元格向量。
看起来tidyxl
软件包是行之有效的方法。将@Wimpel的答案应用于this SO question,关于检测删除线样式,到目前为止,我的理解是:
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
vignette描述了该程序包有助于避免数据帧强制,但是在创建最终数据帧时遇到了麻烦。
也许有人使用tidyxl
或其他openxlsx
这样的R包有解决方案?
答案 0 :(得分:0)
以下使用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")
注释: