여러 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 파일로 내보낼 수 있지만 Excel에서 쉽게 수행 할 수있는 방법이 있어야합니다.
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 -r- 소프트웨어를 사용하여 쉽게 엑셀 파일을 포맷
또한 openxlsx 라이브러리를 사용하여 여러 데이터 세트를 단일 통합 문서의 여러 시트로 내보낼 수 있습니다. xlsx에 비해 openxlsx의 장점은 openxlsx가 자바 라이브러리에 대한 종속성을 제거한다는 것입니다.
목록 이름을 워크 시트 이름으로 사용하여 개별 워크 시트에 data.frame 목록을 작성합니다.
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를 기반으로 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.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이 위에서 언급했듯이 이것은 확실히 벡터화 할 수 있지만 동적 시트 이름을 빠르게 생성하기 위해 for
루프를 사용 하여 시연했습니다.
새 .xlsx 파일을 만들었 기 때문에 create=TRUE
인수를 사용 loadWorkbook
했지만 파일이 이미 존재하는 경우 기본값이이므로 지정할 필요가 없습니다 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 패키지는 엑셀 파일에서 /에서 방대한 데이터를 읽고 쓰는 데 정말 좋으며 Excel 내에서 사용자 지정 서식 지정을위한 많은 옵션이 있습니다.
흥미로운 사실은 여기서 자바 힙 메모리에 대해 신경 쓸 필요가 없다는 것입니다.
나는이 정확한 문제가 있었고 다음과 같이 해결했습니다.
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에 쓸 데이터 프레임이 많은 경우 수동으로 매우 긴 목록을 만들 필요가 없습니다.
나를 위해, 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.frame을 수집 WriteXLS
하고 루프가 완료된 후에 사용해야 합니다.
세션 정보
- R 3.2.4
- WriteXLS 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)
}
분명히 sapply 루틴이 여기에 더 좋을 것입니다.
lapply 친화적 인 버전 ..
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")
'IT박스' 카테고리의 다른 글
Android에서 드로어 블의 이미지를 동적으로 설정하는 방법은 무엇입니까? (0) | 2020.12.06 |
---|---|
케이스 전환 : 하나의 숫자 대신 범위를 사용할 수 있습니까? (0) | 2020.12.06 |
추가 필드와 장고의 ManyToMany 관계 (0) | 2020.12.05 |
HTML5 지연 : 첫 번째 이벤트까지 유효하지 않은 의사 클래스 (0) | 2020.12.05 |
소나 위반 : 보안-어레이가 직접 저장 됨 (0) | 2020.12.05 |