循环以在多个Excel工作簿中创建多个工作表

时间:2020-10-16 15:39:55

标签: r excel dataframe lapply r-xlsx

我有一个包含两个不同组及其值的数据集,如下所示:

example <- data.frame('Group' = c('building 1', 'building 1', 
                                  'building 2', 'building 2'),
                      'Subgroup' = c('Active','Inactive','Active','Inactive'),
                      'Value' = c('abc','def','ghi','jkl'))

我知道我可以使用lapply为每个“建筑物”输出工作簿:

buildings <- split(example, example$Group)

lapply(1:length(buildings), 
        function(x) write.xlsx(buildings[[x]], 
                               file = paste0(names(buildings[x]), '.xlsx'), 
                               row.names = FALSE))

类似地,以下是基于一列在1个工作簿中创建多个工作表的代码:

activity <- split(example, example$Subgroup)

lapply(1:length(activity), 
        function(x) write.xlsx(activity[[x]], file = 'All values.xlsx',
                               sheetName = paste0(names(activity[x])), 
                               append = TRUE, row.names = FALSE))

我的问题是,R中是否有一种方法可以将这些组合(或以其他方式)以按组创建单独的工作簿,并按子组创建多个工作表?我想要的是1号楼的文件,该文件有2张纸:有效和无效。

2 个答案:

答案 0 :(得分:1)

您可以将数据拆分为嵌套列表,第一级由Group拆分,第二级由Subgroup拆分。然后,您可以将它们循环写入带有单独工作表的工作簿中。见下文;

library(dplyr)
library(xlsx)

example %>% 
  mutate_if(is.factor, as.character) %>% 
  split(., .$Group) %>% 
  lapply(., function(x) split(x, x$Subgroup)) %>% 
  lapply(., function(dat) 
    lapply(dat, function(dat.sub) 
      write.xlsx(dat.sub, 
                 file = paste0(as.character(unique(dat.sub$Group)), ".xlsx"),
                 sheetName = paste0(as.character(unique(dat.sub$Subgroup))), 
                 append = TRUE, row.names = FALSE)))

答案 1 :(得分:0)

我如下修改您的代码。由于openxlsx::write.xlsx()将自动使用命名列表的名称(例如activity)作为工作表的名称。您唯一要做的就是在buildings函数中拆分lapply()

example <- data.frame('Group' = c('building 1', 'building 1', 'building 2', 'building 2'),
                      'Subgroup' = c('Active','Inactive','Active','Inactive'),
                      'Value' = c('abc','def','ghi','jkl'))


buildings <- split(example, example$Group)

lapply(seq_along(buildings), 
       function(x) {
         activity <- split(buildings[[x]], buildings[[x]]$Subgroup)
         openxlsx::write.xlsx(
           activity,
           file = paste0(names(buildings[x]), '.xlsx'),
           row.names = FALSE
         )
       })
相关问题