Раскраска переменной столбца во фрейме данных и экспорт ее в Excel

#r

#r

Вопрос:

Можно ли раскрасить переменную столбца, срок действия которой истек в моем фрейме данных, без необходимости преобразовывать ее в Datatable? Если нет, что означает ошибка, показанная ниже, и как мне ее отладить?

Мой фрейм данных

     Id  Name Membership
1 1001  John       Gold
2 1002  Neil       Gold
3 1002  Sam        Expired
4 1003  Tom        Silver
  

Текущий код

 df <- datatable(df, rownames = FALSE) %>% formatStyle(columns = "Membership, background = 
      styleEqual(c("Expired"),c("Red")))
  

когда я пытаюсь преобразовать ее обратно в фрейм данных или экспортировать в Excel. Я столкнусь с этой ошибкой

 Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors): cannot coerce class `c("datatables", "htmlwidget")' to a data.frame
  

Ответ №1:

Вы могли бы использовать openxlsx библиотеку. Существует множество шагов даже для простого форматирования, но преимущество в том, что вы можете выполнять большинство тех же правил форматирования, что и в Excel. Для этого метода вы не будете преобразовывать в a datatable , просто сохраните свои данные в a dataframe , вставьте их в Workbook объект, затем примените форматирование saveWorkbook() .

 library(openxlsx)
library(tidyverse)

df <- data_frame(Id = c(1001,1002,1002,1003),
                 Name = c('John','Neil','Sam','Tom'),
                 Membership = c('Gold','Gold','Expired','Silver'))

wb <- createWorkbook()
addWorksheet(wb, 'Members')
writeData(wb, 'Members', df)
redStyle = createStyle(fontColour = '#FF0000')
conditionalFormatting(wb, 'Members', 
                      cols = 3,
                      rows = 1:5,
                      rule = '=="Expired"',
                      style = redStyle)

saveWorkbook(wb, 'export.xlsx', overwrite = TRUE)
  

Если, конечно, идея состоит в том, чтобы форматированные ячейки отображались в вашей консоли R, это не сработает. Если вас больше всего интересует форматированный .xlsx вывод, это будет именно то, что вам нужно.