Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将一个数据框逐行拆分为多个数据框,然后将其导出到excel?R_R_Dplyr - Fatal编程技术网

如何将一个数据框逐行拆分为多个数据框,然后将其导出到excel?R

如何将一个数据框逐行拆分为多个数据框,然后将其导出到excel?R,r,dplyr,R,Dplyr,这是我正在处理的数据 Sales <- data.frame(State = c("New York", "New Jersey", "Texas","New Mexico","California", "Kansas","Florida","Alaska",&quo

这是我正在处理的数据

Sales <- data.frame(State  = c("New York", "New Jersey", "Texas","New Mexico","California",
                                "Kansas","Florida","Alaska","Montana", "Maine"),
                     
                  Units = c(455,453,125,135,135,568,451,125,215,314),
                  
                  Sales = c("20000","12530","51110","54110","65000",
                            "58220","54612","45102","45896","12510"),
                             
                  ManagerName = c("Chip","Kelly","Steve","Young","Troy",
                                  "Aikman", "Chad","Pennington","Mike","Vick")
                  
)

Salesfor()的简短
for
循环示例

for (i in Sales$State){
  print(i)
  FilterData <- Sales %>% filter(State == i) 
  filename<-paste0(i, "-Sales-Nov2020.xlsx")
  write.xlsx(FilterData, file=filename, sheetName=i)
}
for(i处于销售额$State){
印刷品(一)
FilterData%筛选器(状态==i)
文件名也许可以试试这个

ls_of_dfs <- split(Sales, Sales$State)
mapply(write.xlsx, ls_of_dfs, sheetName = names(ls_of_dfs), MoreArgs = list(file = "NewYork-Sales-November2020.xlsx", append = TRUE))

ls\u of_dfs以下内容符合问题的要求,我已使用发布的数据对其进行了测试

  • 状态拆分
    数据
  • 创建工作簿
  • 将工作表添加到工作簿中
  • 将每个子data.frame写入工作簿
  • 将所有内容保存到磁盘
  • 图纸的名称为
    状态

    library(openxlsx)
    
    sp <- split(Sales, Sales$State)
    names(sp) <- ifelse(nchar(names(sp)) > 31, substr(names(sp), 1, 31), names(sp))
    wb <- createWorkbook(creator = "FruityPebblePug")
    lapply(seq_along(sp), function(i){
      addWorksheet(wb, sheetName = names(sp)[[i]])
    })
    lapply(seq_along(sp), function(i){
      writeData(wb, sheet = names(sp)[[i]], sp[[i]])
    })
    saveWorkbook(wb, "Sales-November2020.xlsx")
    

    我通常更喜欢将它们都写在一个文件中的单独工作表中。否则,您可以使用
    purr::iwalk()
    函数将它们分别写在一个单独的文件中

    library(rlang)
    library(tidyverse)
    library(writexl)
    
    按组拆分并给出每个列表的名称

    # https://github.com/tidyverse/dplyr/issues/4223
    named_group_split <- function(.tbl, mysep = "", ...) {
      grouped <- group_by(.tbl, ...)
      names <- rlang::eval_bare(rlang::expr(paste(!!!group_keys(grouped), sep = mysep)))
      
      grouped %>%
        group_split(., .keep = FALSE) %>%
        rlang::set_names(names)
    }
    
    Sales_list <- Sales %>% 
      named_group_split(., mysep = "", State)
    Sales_list
    
    # make temporary directory
    tmp_dir <- tempdir()
    
    将每个列表写入一个单独的文件

    iwalk(Sales_list, ~ write_xlsx(.x, file.path(tmp_dir, paste0("Sales_", .y, ".xlsx"))))
    

    我喜欢这种方法,但有没有办法用“openxlsx”来编写xlsx文件?由于某种原因,我无法加载库(xlsx)。我使用了从您的问题中引用的write.xlsx()函数,您可以轻松地用openxlsx替换!如果sp名称太长,我该怎么办?我收到了此错误。addWorksheet中的错误(wb,sheetName=名称(sp)[[i]]:sheetName太长!最大长度为31个字符。@FruityPebblePug已更正,请参阅
    拆分
    后的行。如果前31个字符重叠,您可能会得到重复的名称。Excel对工作表名称的限制为31个字符,这不是R限制。如果这些是状态,我认为这不会成为问题。@Reeza是的,我知道这是个问题“这是Excel的一个限制,不是R。但是OP显然有这个问题。如果问题仍然存在,另一个解决方案是给工作表编号。@Ruibarrada抱歉,我的评论主要是针对OP的,但仅使用前31个字符的解决方案也不可靠。”。
    # https://github.com/tidyverse/dplyr/issues/4223
    named_group_split <- function(.tbl, mysep = "", ...) {
      grouped <- group_by(.tbl, ...)
      names <- rlang::eval_bare(rlang::expr(paste(!!!group_keys(grouped), sep = mysep)))
      
      grouped %>%
        group_split(., .keep = FALSE) %>%
        rlang::set_names(names)
    }
    
    Sales_list <- Sales %>% 
      named_group_split(., mysep = "", State)
    Sales_list
    
    # make temporary directory
    tmp_dir <- tempdir()
    
    write_xlsx(Sales_list, file.path(tmp_dir, "Sales_by_state_all.xlsx"))
    
    iwalk(Sales_list, ~ write_xlsx(.x, file.path(tmp_dir, paste0("Sales_", .y, ".xlsx"))))