【问题标题】:Loop to create multiple sheets in multiple Excel workbooks循环在多个 Excel 工作簿中创建多个工作表
【发布时间】:2020-10-16 15:39:55
【问题描述】:

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

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 中有没有一种方法可以将这些组合起来(或者是否有其他方法)以按组创建单独的工作簿,并按子组创建多个工作表?我想要的是一个包含 2 张工作表的 Building 1 文件:Active 和 Inactive。

【问题讨论】:

    标签: r excel dataframe lapply r-xlsx


    【解决方案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)))
    

    【讨论】:

    • 使用当前版本的dplyr,它将是mutate(across(where(is.factor), as.character))
    • @akrun 我还没有阅读更新日志,你的意思是mutate_... 已被弃用?
    • 将来会被弃用。现在,全部在mutateacross
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 2021-01-11
      相关资源
      最近更新 更多