개인적으로 R로만 작업을 한다면 연관된 dataframe들을 list의 형태로 저장해서 사용하는게 편하지만, 주변에 같이 일하는 모든 사람이 R을 능숙하게 다루는 것도 아니고 또 한개의 작업에 연관된 csv 파일을 여러개로 쪼개서 전달해준다거나 하면 불친절한 사람이라는 딱지가 뙇 붙기 십상입니다.


(절대 이렇게 생각하면 안된다)

이런 경우, 대용량의 데이터가 아니라면 한개의 엑셀파일에 각각의 데이터를 sheet로 구분해 전달해 주는 것이 가장 효율적인데, 기존의 xlsx 패키지를 이용해 write.xlsx() 함수를 이용할 경우 여러개의 sheet를 한꺼번에 저장할 수가 없습니다(아마도..).

openxlsx 패키지

이번 포스팅에서는 openxlsx 패키지를 이용하여 여러개의 데이터프레임을 하나의 엑셀파일에 저장해 보도록하겠습니다.

library(openxlsx)

Workbook을 만들고-sheet를 만들고-쓰고-저장하는 다음 4개의 함수를 기억하시면 됩니다. createWorkbook()-addWorksheet()-writeDataTable()-saveWorkbook()

우리가 사랑하는 irismtcars로 예시 데이터를 만들어 보겠습니다.

a <- iris
b <- mtcars
  1. 예제 Workbook을 만들고
example <- createWorkbook("example")
example
## A Workbook object.
##
## Worksheets:
##  No worksheets attached
  1. Worksheet를 추가해줍니다.
addWorksheet(example, "a")
addWorksheet(example, "b")
example
## A Workbook object.
##
## Worksheets:
##  Sheet 1: "a"
##
##
##  Sheet 2: "b"
##
##
##
##  Worksheet write order: 1, 2
  1. 다음과 같이 만들어 놓은 Worksheet에 각 데이터를 넣을 수 있습니다.
writeDataTable(example,"a",a)
writeDataTable(example,"b",b)
  1. 저장해 줍니다. write.csv()와 비슷하게 사용하면 됩니다.
saveWorkbook(example, file="example.xlsx")

결과물은 다음과 같습니다.

apply 함수의 응용

다음 stackoverflow 문서를 참고하세요.

저장 문제 해결

다음과 같은 에러 메시지가 발생하는 경우가 있는데

Error: zipping up workbook failed. Please make sure Rtools is installed or a zip application is available to R.
         Try installr::install.rtools() on Windows. If the "Rtools\bin" directory does not appear in Sys.getenv("PATH") please add it to the system PATH
         or set this within the R session with Sys.setenv("R_ZIPCMD" = "path/to/zip.exe")

아마도 대부분 다음 코드를 실행함으로 해결이 가능할 것 같습니다.

if(devtools::find_rtools()) Sys.setenv(R_ZIPCMD= file.path(devtools:::get_rtools_path(),"zip"))