programing

여러 data.frame을 여러 Excel 워크시트로 쉽게 내보낼 수 있는 방법

topblog 2023. 6. 12. 21:02
반응형

여러 data.frame을 여러 Excel 워크시트로 쉽게 내보낼 수 있는 방법

여러 data.frame을 Excel 파일의 여러 워크시트로 쉽게 내보낼 수 있는 방법이 없다는 사실에 놀랐습니다.xlsx 패키지를 시도해 봤는데, 한 장에만 쓸 수 있는 것 같습니다(이전 시트를 덮어씁니다);WriteXLS 패키지도 시도해봤는데 항상 오류가 납니다...

제 코드 구조는 다음과 같습니다. 설계상 각 반복에 대해 출력 데이터 프레임(tempTable)과 sheetName(sn)이 업데이트되어 하나의 탭으로 내보내졌습니다.

for (i in 2 : ncol(code)){ 
        ...
        tempTable <- ...
        sn <- ...
        WriteXLS("tempTable", ExcelFileName = "C:/R_code/../file.xlsx",
              SheetNames = sn);
}

여러 개의 cvs 파일로 내보낼 수 있는데 엑셀로 쉽게 내보낼 수 있는 방법이 있어야 하는 거죠?

으로 여러 에 쓸 수 .xlsx꾸러미당신은 단지 다른 것을 사용하면 됩니다.sheetName.append=TRUE:

library(xlsx)
write.xlsx(dataframe1, file="filename.xlsx", sheetName="sheet1", row.names=FALSE)
write.xlsx(dataframe2, file="filename.xlsx", sheetName="sheet2", append=TRUE, row.names=FALSE)

서식 설정 및 데이터 프레임 배치를 보다 효과적으로 제어할 수 있는 또 다른 옵션은 R/xlsx 코드 내에서 모든 작업을 수행한 다음 마지막에 워크북을 저장하는 것입니다.예:

wb = createWorkbook()

sheet = createSheet(wb, "Sheet 1")

addDataFrame(dataframe1, sheet=sheet, startColumn=1, row.names=FALSE)
addDataFrame(dataframe2, sheet=sheet, startColumn=10, row.names=FALSE)

sheet = createSheet(wb, "Sheet 2")

addDataFrame(dataframe3, sheet=sheet, startColumn=1, row.names=FALSE)

saveWorkbook(wb, "My_File.xlsx")

다음은 및에 더 할 수 입니다.xlsx: http://www.sthda.com/english/wiki/r2excel-read-write-and-format-easily-excel-files-using-r-software

openxlsx 라이브러리를 사용하여 여러 데이터 세트를 단일 워크북의 여러 시트로 내보낼 수도 있습니다.openxlsx와 xlsx의 장점은 openxlsx가 Java 라이브러리에 대한 종속성을 제거한다는 것입니다.

목록 이름을 워크시트 이름으로 사용하여 data.frames 목록을 개별 워크시트에 작성합니다.

require(openxlsx)
list_of_datasets <- list("Name of DataSheet1" = dataframe1, "Name of Datasheet2" = dataframe2)
write.xlsx(list_of_datasets, file = "writeXLSX2.xlsx")

rOpenSci의 새로운 도서관이 마을에 있습니다: writexl.

libxlsxwriter 기반의 휴대용 경량 데이터 프레임 to xlsx 익스포터.Java 또는 Excel이 필요하지 않습니다.

위의 제안(개발 버전으로 작업)보다 더 낫고 빠르다는 것을 알게 되었습니다.

library(writexl)
sheets <- list("sheet1Name" = sheet1, "sheet2Name" = sheet2) #assume sheet1 and sheet2 are data frames
write_xlsx(sheets, "path/to/location")

여기에 많은 좋은 답변들이 있지만, 그 중 일부는 약간 구식입니다.단일 파일에 워크시트를 추가하려면 이 방법이 적합하다고 생각합니다.명확한 설명을 위해 다음과 같은 워크플로우가 있습니다.openxlsx 4.(으)로 4.0 제공

# Create a blank workbook
OUT <- createWorkbook()

# Add some sheets to the workbook
addWorksheet(OUT, "Sheet 1 Name")
addWorksheet(OUT, "Sheet 2 Name")

# Write the data to the sheets
writeData(OUT, sheet = "Sheet 1 Name", x = dataframe1)
writeData(OUT, sheet = "Sheet 2 Name", x = dataframe2)

# Export the file
saveWorkbook(OUT, "My output file.xlsx")

편집

저는 이제 몇 가지 다른 답들을 시도해 보았습니다. 그리고 저는 사실 @Syed's를 정말 좋아합니다.의 모든 기능을 활용하지는 않습니다.openxlsx하지만 신속하고 신속한 수출 방법을 원한다면 그것이 아마도 가장 간단한 방법일 것입니다.

에 대해 잘 모릅니다.WriteXLS으로 사니다합용주를 사용합니다.XLConnect:

library(XLConnect)
##
newWB <- loadWorkbook(
  filename="F:/TempDir/tempwb.xlsx",
  create=TRUE)
##
for(i in 1:10){
  wsName <- paste0("newsheet",i)
  createSheet(
    newWB,
    name=wsName)
  ##
  writeWorksheet(
    newWB,
    data=data.frame(
      X=1:10,
      Dataframe=paste0("DF ",i)),
    sheet=wsName,
    header=TRUE,
    rownames=NULL)
}
saveWorkbook(newWB)

위에서 한 @될 수 , 빨리 , 저는 @joran @joran 처실수있만지벡단, 시이빠생기위다르사니을습하게해성했는다, 용을음저름트에위서지급언동적터한될화히확것을 했습니다.for루프를 사용하여 시연합니다.

사용했습니다.create=TRUE에 있어서의 논쟁.loadWorkbook파일을 한다면 이할 필요가 기본값은 ".xlsx 파일"입니다.FALSE.

다음은 생성된 워크북의 몇 가지 스크린샷입니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

여기에 이미지 설명 입력

데이터 크기가 작은 경우, R은 당신의 요구에 따라 활용할 수 있는 패키지와 기능을 많이 가지고 있습니다.

write.xlsx, write.xlsx2, XLconnect도 작동하지만 openxlsx에 비해 느린 경우가 있습니다.

따라서 대용량 데이터 세트를 처리하다가 Java 오류가 발생한 경우.저는 정말 멋진 "openxlsx"를 보고 시간을 1/12로 줄일 것을 제안합니다.

저는 모든 것을 테스트했고 마침내 openxlsx 기능의 성능에 깊은 인상을 받았습니다.

다음은 여러 데이터 세트를 여러 시트에 쓰는 단계입니다.

 install.packages("openxlsx")
 library("openxlsx")

    start.time <- Sys.time()

    # Creating large data frame
    x <- as.data.frame(matrix(1:4000000,200000,20))
    y <- as.data.frame(matrix(1:4000000,200000,20))
    z <- as.data.frame(matrix(1:4000000,200000,20))

    # Creating a workbook
    wb <- createWorkbook("Example.xlsx")
    Sys.setenv("R_ZIPCMD" = "C:/Rtools/bin/zip.exe") ## path to zip.exe

Sys.setenv("R_ZIPCMD" = "C:/Rtools/bin/zip.exe")는 Rtools의 일부 유틸리티를 참조하므로 정적이어야 합니다.

참고: 시스템에 Rtools가 설치되어 있지 않은 경우 원활한 사용을 위해 먼저 설치하십시오.다음은 참조용 링크입니다. (적절한 버전을 선택하십시오.

https://cran.r-project.org/bin/windows/Rtools/ 아래 링크에 따라 옵션을 확인합니다(설치하는 동안 모든 확인란을 선택해야 함).

https://cloud.githubusercontent.com/assets/7400673/12230758/99fb2202-b8a6-11e5-82e6-836159440831.png

    # Adding a worksheets : parameters for addWorksheet are 1. Workbook Name 2. Sheet Name

    addWorksheet(wb, "Sheet 1")
    addWorksheet(wb, "Sheet 2")
    addWorksheet(wb, "Sheet 3")

    # Writing data in to respetive sheets: parameters for writeData are 1. Workbook Name 2. Sheet index/ sheet name 3. dataframe name

    writeData(wb, 1, x)

    # incase you would like to write sheet with filter available for ease of access you can pass the parameter withFilter = TRUE in writeData function.
    writeData(wb, 2, x = y, withFilter = TRUE)

    ## Similarly writeDataTable is another way for representing your data with table formatting:

    writeDataTable(wb, 3, z)

    saveWorkbook(wb, file = "Example.xlsx", overwrite = TRUE)

    end.time <- Sys.time()
    time.taken <- end.time - start.time
    time.taken

openxlsx 패키지는 엑셀 파일에서 엄청난 양의 데이터를 읽고 쓰는 데 매우 유용하며 엑셀 내에서 사용자 지정 포맷을 위한 많은 옵션이 있습니다.

흥미로운 사실은 우리가 여기서 자바 힙 메모리에 대해 신경 쓸 필요가 없다는 것입니다.

저는 이 정확한 문제를 가지고 있었고 다음과 같은 방법으로 해결했습니다.

library(openxlsx) # loads library and doesn't require Java installed

your_df_list <- c("df1", "df2", ..., "dfn")

for(name in your_df_list){
  write.xlsx(x = get(name), 
             file = "your_spreadsheet_name.xlsx", 
             sheetName = name)
}

이렇게 하면 Excel에 쓸 데이터 프레임이 많은 경우 매우 긴 목록을 수동으로 작성할 필요가 없습니다.

저는 모든 종류의 수출을 위해 정기적으로 패키지 리오를 사용합니다.rio를 사용하여 목록을 입력하고 각 탭의 이름을 지정하고 데이터 집합을 지정할 수 있습니다.rio는 다른 입력/출력 패키지를 컴파일하고 Excel로 내보내기 위해 openxlsx를 사용합니다.

library(rio)

filename <- "C:/R_code/../file.xlsx"

export(list(sn1 = tempTable1, sn2 = tempTable2, sn3 = tempTable3), filename)

하나의 데이터 프레임을 사용하고 그룹별로 시트를 작성하는 깔끔한 방법:

library(tidyverse)
library(xlsx)
mtcars %>% 
  mutate(cyl1 = cyl) %>% 
  group_by(cyl1) %>% 
  nest() %>% 
  ungroup() %>% 
  mutate(rn = row_number(),
         app = rn != 1,
         q = pmap(list(rn,data,app),~write.xlsx(..2,"test1.xlsx",as.character(..1),append = ..3)))

나를 위해.WriteXLS찾고 있는 기능을 제공합니다.반환되는 오류를 지정하지 않았기 때문에 다음과 같은 예를 보여드리겠습니다.

library(WriteXLS)
x <- list(sheet_a = data.frame(a=letters), sheet_b = data.frame(b = LETTERS))
WriteXLS(x, "test.xlsx", names(x))

설명.

한다면x다음과 같습니다.

  • 각 데이터 프레임이 단일 시트에 기록된 데이터 프레임 목록
  • (R 객체의) 문자 벡터, 각 객체는 단일 시트에 기록됩니다.
  • 다른 항목을 선택한 다음 도움말에 표시된 내용도 확인하십시오.

사용에 대한 더 많은 정보

?WriteXLS

표시:

`x`: A character vector or factor containing the names of one or
     more R data frames; A character vector or factor containing
     the name of a single list which contains one or more R data
     frames; a single list object of one or more data frames; a
     single data frame object.

해결책

예를 들어 루프 중에 목록에 있는 모든 data.frames를 수집하고 다음을 사용해야 합니다.WriteXLS루프가 종료된 후.

세션 정보

  • R 3.2.4
  • XLS 4.0.0 쓰기

다음 기능을 사용하여 openxlsx에 대해 이 방법으로 수행합니다.

mywritexlsx<-function(fname="temp.xlsx",sheetname="Sheet1",data,
                  startCol = 1, startRow = 1, colNames = TRUE, rowNames = FALSE)
{
  if(! file.exists(fname))
    wb = createWorkbook()
  else
   wb <- loadWorkbook(file =fname)
  sheet = addWorksheet(wb, sheetname)

  writeData(wb,sheet,data,startCol = startCol, startRow = startRow, 
          colNames = colNames, rowNames = rowNames)
  saveWorkbook(wb, fname,overwrite = TRUE)
}

항상 하는 일이지만, 제가 하는 일은

WriteXLS::WriteXLS(
    all.dataframes,
    ExcelFileName = xl.filename,
    AdjWidth = T,
    AutoFilter = T,
    FreezeRow = 1,
    FreezeCol = 2,
    BoldHeaderRow = T,
    verbose = F,
    na = '0'
  )

그리고 그 모든 데이터 프레임들은 여기서 옵니다.

all.dataframes <- vector()
for (obj.iter in all.objects) {
  obj.name <- obj.iter
  obj.iter <- get(obj.iter)
  if (class(obj.iter) == 'data.frame') {
      all.dataframes <- c(all.dataframes, obj.name)
}

분명히 애플리 루틴이 여기서 더 나을 것입니다.

적용하기 쉬운 버전을 위해 .

library(data.table)
library(xlsx)

path2txtlist <- your.list.of.txt.files
wb <- createWorkbook()
lapply(seq_along(path2txtlist), function (j) {
sheet <- createSheet(wb, paste("sheetname", j))
addDataFrame(fread(path2txtlist[j]), sheet=sheet, startColumn=1, row.names=FALSE)
})

saveWorkbook(wb, "My_File.xlsx")

언급URL : https://stackoverflow.com/questions/27713310/easy-way-to-export-multiple-data-frame-to-multiple-excel-worksheets

반응형