在函数中堆叠不同的数据帧

stack different dataframes in a function

我无法在 for 循环中堆叠可变数量的数据帧。有人可以帮我吗?

# Load libraries
library(dplyr)
library(tidyverse)
library(here)

一个应该打开所有 excel 文件并使用 plyr::rbind.fill() 创建一个文件的函数:

stackDfs <- function(filenames){
  for(fn in filenames){
    df1 <- openxlsx::read.xlsx(here::here("folder1", "folder2", fn), sheet=6, detectDates = TRUE)
    # ... do some additional mutations here
  }
    
  all_dfs <- (plyr::rbind.fill(df1, df2, df3, df4, ...)
  return(all_dfs)
}

这里我定义应该打开哪些文件并调用堆叠函数。堆叠的文件数量应该是可变的。

filenames <- c("filexy-20210202.xlsx", "filexy-2021-20210205.xlsx")
stackDfs(filenames)

使用当前设置,我们可以初始化一个 list,将数据读入 list,然后在 do.call

中应用 rbind.fill
stackDfs <- function(filenames){
    out_lst <- vector('list', length(filenames))
    names(out_list) <- filenames
    for(fn in filenames){
     out_list[[fn]] <- openxlsx::read.xlsx(here::here("folder1",
          "folder2", fn), sheet=6, detectDates = TRUE)
      #....
     }
   all_dfs <- do.call(plyr::rbind.fill, out_lst)
   all_dfs
}

根据关于使用 purrr 的评论,如果将所有文件放在同一个文件夹中,则可以使用名为 fs 的包而不是手动输入所有文件名:

library(tidyverse)
library(here)
library(fs)

filenames <- fs::dir_ls(here("files"))

all_dfs <- filenames %>%
   map_dfr(openxlsx:read.xlsx, sheet = 6, detectDates = TRUE)
all_dfs