使用R和Openxlsx在单个Excel文件中输出作为工作表的数据框列表

我有一组CSV文件。 我想打包并将数据导出到包含多个工作表的单个Excel文件。 我在CSV文件中读取一组dataframe。

我的问题是如何在openxlsx构build命令,我可以手动,但我有一个列表build设问题。 具体如何添加数据框作为命名列表的子组件,然后作为parameter passing给write.xlsx()

好吧,我首先列出磁盘上的CSV文件,并在内存中生成一组dataframe。

 # 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) 

输出示例:

 dput(datasets) c("S10000_R3.3.2_201703301839", "S10000_T4.3.0_201703301843", "S20000_R3.3.2_201703301826", "S20000_T4.3.0_201703301832", "S280000_R3.3.2_201704020847", "S280000_T4.3.0_201704021100", "S290000_R3.3.2_201704020447", "S290000_T4.3.0_201704020702", "S30000_R3.3.2_201703301803", "S30000_T4.3.0_201703301817", "S310000_R3.3.2_201704012331", "S310000_T4.3.0_201704020242", "S320000_R3.3.2_201704011827", "S320000_T4.3.0_201704012128", "S330000_R3.3.2_201704011304", "S330000_T4.3.0_201704011546", "S340000_R3.3.2_201704010652", "S340000_T4.3.0_201704011010", "S350000_R3.3.2_201704010020", "S350000_T4.3.0_201704010404", "S360000_R3.3.2_201703311819", "S360000_T4.3.0_201703312134", "S370000_R3.3.2_201703310914", "S370000_T4.3.0_201703311301", "S380000_R3.3.2_201703310134", "S380000_T4.3.0_201703310509", "S390000_R3.3.2_201703301846", "S390000_T4.3.0_201703302252", "S40000_R3.3.2_201703301738", "S40000_T4.3.0_201703301752", "S50000_R3.3.2_201703301707", "S50000_T4.3.0_201703301724", "S60000_R3.3.2_201703301624", "S60000_T4.3.0_201703301647", "S70000_R3.3.2_201703301535", "S70000_T4.3.0_201703301602", "S80000_R3.3.2_201703301430", "S80000_T4.3.0_201703301508", "S90000_R3.3.2_201703301324", "S90000_T4.3.0_201703301400") 

现在我们有一组数据框架,我们希望创build一个包含多个工作表的单个Excel文件。

 wb <- createWorkbook() saveWorkbook(wb, 'output.xlsx') lapply(names(myList), function(x) write.xlsx(myList[[x]], 'output.xlsx', sheetName=x, append=TRUE)) 

问题:

问题是我可以手动创build列表结构,并可以确认它的工作,但我似乎无法自动构造列表。

 myList <- sapply(datasets,function(x) NULL) names(myList) str(myList) 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 ... 

具体问题:如何将每个数据框添加到列表中…

 myList <- lapply( myList, function(x) eval(x) ) 

我在这里做了什么错误? 上面的lapply()不会遍历列表并将数据框添加到名称列表条目中。

 ie 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 ... 

我错过了什么? 所有帮助感激地赞赏。 是的,我很确定我错过了一些明显的东西…但是…我很难过。

我没有你的数据框架,所以我不能testing这个,但是下面的代码与我需要读写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)) 

您现在有一个列表,其中每个元素是一个数据框,每个元素的名称是文件的名称。 现在,让我们将每个数据框写入同一个Excel工作簿中的不同工作表,然后将该文件保存为xlsx文件:

 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") 

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