複数のdata.frameをExcelファイルの複数のワークシートにエクスポートする簡単な方法がないことに私は驚いていますか? xlsxパッケージを試しましたが、1つのシートにしか書き込むことができないようです(古いシートを上書きします)。 WriteXLSパッケージも試しましたが、常にエラーが発生します...
私のコード構造は次のようなものです。設計により、反復ごとに、出力データフレーム(tempTable)とsheetName(sn)が更新され、1つのタブにエクスポートされました。
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)
もう1つのオプションは、書式設定とデータフレームの配置をより細かく制御できるオプションで、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ライブラリを使用して、複数のデータセットを1つのワークブックの複数のシートにエクスポートできます。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に基づくxlsxエクスポーターへのポータブルで軽量なデータフレーム。 JavaまたはExcelは不要
上記の提案(devバージョンでの作業)よりも優れていて高速であることがわかりました。
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が本当に好きです。 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ファイルを作成していたので、loadWorkbook
でcreate=TRUE
引数を使用しましたが、ファイルが既に存在する場合、デフォルト値は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ファイルとの間で膨大なデータを読み書きするのに非常に優れており、Excel内のカスタム書式設定のための多くのオプションがあります。
興味深い事実は、ここでJavaヒープメモリを気にする必要がないことです。
私はこの正確な問題を抱えていたので、この方法で解決しました。
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::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ルーチンが良いでしょう
私にとって、WriteXLS
はあなたが探している機能を提供します。返されるエラーを指定しなかったため、例を示します。
例
library(WriteXLS)
x <- list(sheet_a = data.frame(a=letters), sheet_b = data.frame(b = LETTERS))
WriteXLS(x, "test.xlsx", names(x))
説明
x
が次の場合:
使用方法の詳細
?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
を使用する必要があります。
セッション情報
私は次の関数を使用して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)
}
ラップフレンドリーなバージョンの場合.
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")