使用R和Openxlsx将数据帧列表作为工作表输出到单个Excel文件中

使用R和Openxlsx将数据帧列表作为工作表输出到单个Excel文件中,r,excel,lapply,xlsx,openxlsx,R,Excel,Lapply,Xlsx,Openxlsx,我有一组CSV文件。我想将它们打包并将数据导出到包含多个工作表的单个Excel文件中。我将CSV文件作为一组数据帧读入 我的问题是如何在openxlsx中构造命令,我可以手动执行,但我有一个列表构造问题。特别是如何添加数据帧作为命名列表的子组件,然后作为参数传递给write.xlsx() 例子 好的,我首先列出磁盘上的CSV文件,并在内存中生成一组数据帧 # Generate a list of csv files on disk and shorten names... filePath &

我有一组CSV文件。我想将它们打包并将数据导出到包含多个工作表的单个Excel文件中。我将CSV文件作为一组数据帧读入

我的问题是如何在
openxlsx
中构造命令,我可以手动执行,但我有一个列表构造问题。特别是如何添加数据帧作为命名列表的子组件,然后作为参数传递给
write.xlsx()

例子 好的,我首先列出磁盘上的CSV文件,并在内存中生成一组数据帧

# Generate a list of csv files on disk and shorten names... 
filePath <- "../02benchmark/results/results_20170330/"
filePattern <- "*.csv"
fileListwithPath = list.files(path = filePath, pattern = filePattern, full.names = TRUE)
fileList = list.files(path = filePath, pattern = filePattern, full.names = FALSE)

datasets <- gsub("*.csv$", "", fileList)
datasets <- gsub("sample_", "S", datasets)
datasets

# Now generate the dataframes for each csv file...
list2env(
  lapply(setNames(fileListwithPath, make.names(datasets)),
         read.csv), envir = .GlobalEnv)
现在我们有了一组数据框架,我们希望创建一个包含多个工作表的excel文件。。。 具体问题:如何将每个数据帧追加到列表中。。。
myList我没有您的数据框,因此无法测试,但下面的代码与我在需要读写Excel文件时使用的方法类似。下面的代码使用了
xlsx
包,这是我所熟悉的,但如果需要使用
openxlsx
,希望您可以对其进行调整

library(xlsx)
首先,将文件读入列表。大概是这样的:

filePath <- "../02benchmark/results/results_20170330/"
filePattern <- "*.csv"
fileListwithPath = list.files(path = filePath, 
                              pattern = filePattern, 
                              full.names = TRUE)
fileList = list.files(path = filePath, pattern = filePattern, full.names = FALSE)
fileListwithPath = setNames( fileListwithPath, 
                             list.files(path = filePath, pattern = filePattern))
df.list = lapply(fileListwithPath, read.csv)

# Now we rename the List Names for use in worksheets...
# Remove .csv and sample_ prefix used in filenames...
# Reult in workbook S<size>_<R version>_<date>
names(df.list) <- gsub("\\.csv$","", names(df.list))
names(df.list) <- gsub("sample_","S", names(df.list))

我已经将读取和写入csv文件分开进行了说明,但您可以将它们组合成一个函数,该函数读取每个csv文件并将其写入单个Excel工作簿中的新工作表。

以下是使用
openxlsx
的解决方案:

## create data;
dataframes <- split(iris, iris$Species)

# create workbook
wb <- createWorkbook()
 
#Iterate the same way as PavoDive, slightly different (creating an anonymous function inside Map())
Map(function(data, nameofsheet){     

    addWorksheet(wb, nameofsheet)
    writeData(wb, nameofsheet, data)
 
}, dataframes, names(dataframes))
         
## Save workbook to excel file 
saveWorkbook(wb, file = "file.xlsx", overwrite = TRUE)
创建数据;
dataframes我认为使用包中的函数添加解决方案是值得的,因为它提供了一种方便的机制,可以在一次调用中访问列表元素的名称和索引:

imap\u xxx(x,…)
是索引地图,如果
x有名称,则是
map2(x,名称(x),…)
的缩写;如果没有名称,则是
map2(x,沿(x),…)
。如果您需要同时计算元素的值和位置,这将非常有用

imap
解决方案 关于再现性的虚拟数据


lst\u数据谢谢。您提供的代码工作正常-非常感谢。我需要花一点时间熟悉列表操作。如果我修复了我的原始代码,我会发布一个解释。你让我向前迈进——非常感谢你的帮助。良好的因果报应和感激之情飞向你。我很想知道如何将目标工作表的名称从
df.list$sample\u 10000\u R3.3.2\u 201703301839.csv
更改为
df.list$S10000\u R3.3.2\u 201703301839
-我知道很简单,但请参阅更新。我添加了一行删除每个文件名末尾的“.csv”。eipi10-谢谢,我更新了您的示例以反映最终代码。在使用
lappy()
读取文件后,我必须更改
df.list
名称。非常感谢您的帮助:-)您可以使用
iwalk
避免在控制台上显示任何消息
> str(myList)
List of 40
 $ S10000_R3.3.2_201703301839 :'data.frame':    43 obs. of  4 variables:
  ..$ function.: Factor w/ 42 levels "DF add random number vector",..: 30 25 38 42 36 39 40 29 26 22 ...
  ..$ user     : num [1:43] 2.144 0.263 0.024 0.068 0.008 ...
  ..$ system   : num [1:43] 0.63 0.065 0.001 0.004 0 ...
  ..$ elapsed  : num [1:43] 12.274 1.104 0.047 0.115 0.009 ...
 $ S10000_T4.3.0_201703301843 : NULL
 $ S20000_R3.3.2_201703301826 : NULL
 ...
myList <- lapply( myList, function(x) eval(x) )
i.e. myList$S10000_R3.3.2_201703301839 <- eval(S10000_R3.3.2_201703301839)
> str(myList)
    List of 40
     $ S10000_R3.3.2_201703301839 :'data.frame':    43 obs. of  4 variables:
      ..$ function.: Factor w/ 42 levels "DF add random number vector",..: 30 25 38 42 36 39 40 29 26 22 ...
      ..$ user     : num [1:43] 2.144 0.263 0.024 0.068 0.008 ...
      ..$ system   : num [1:43] 0.63 0.065 0.001 0.004 0 ...
      ..$ elapsed  : num [1:43] 12.274 1.104 0.047 0.115 0.009 ...
     $ S10000_T4.3.0_201703301843 : NULL
     $ S20000_R3.3.2_201703301826 : NULL
     ...
library(xlsx)
filePath <- "../02benchmark/results/results_20170330/"
filePattern <- "*.csv"
fileListwithPath = list.files(path = filePath, 
                              pattern = filePattern, 
                              full.names = TRUE)
fileList = list.files(path = filePath, pattern = filePattern, full.names = FALSE)
fileListwithPath = setNames( fileListwithPath, 
                             list.files(path = filePath, pattern = filePattern))
df.list = lapply(fileListwithPath, read.csv)

# Now we rename the List Names for use in worksheets...
# Remove .csv and sample_ prefix used in filenames...
# Reult in workbook S<size>_<R version>_<date>
names(df.list) <- gsub("\\.csv$","", names(df.list))
names(df.list) <- gsub("sample_","S", names(df.list))
wb = createWorkbook()

lapply( names(df.list), 
        function(df) {
          sheet = createSheet(wb, df)
          addDataFrame(df.list[[df]], sheet = sheet, row.names = FALSE)
          } )

saveWorkbook(wb, "My_workbook.xlsx")
## create data;
dataframes <- split(iris, iris$Species)

# create workbook
wb <- createWorkbook()
 
#Iterate the same way as PavoDive, slightly different (creating an anonymous function inside Map())
Map(function(data, nameofsheet){     

    addWorksheet(wb, nameofsheet)
    writeData(wb, nameofsheet, data)
 
}, dataframes, names(dataframes))
         
## Save workbook to excel file 
saveWorkbook(wb, file = "file.xlsx", overwrite = TRUE)
lst_data <- list(cars = mtcars, air = airmiles)
wb <- openxlsx::createWorkbook()
purrr::imap(
    .x = lst_data,
    .f = function(df, object_name) {
        openxlsx::addWorksheet(wb = wb, sheetName = object_name)
        openxlsx::writeData(wb = wb, sheet = object_name, x = df)
    }
)
t_file <- tempfile(pattern = "test_df_export", fileext = ".xlsx")
saveWorkbook(wb = wb, file = t_file)