【问题标题】:stack different dataframes in a function在函数中堆叠不同的数据帧
【发布时间】:2021-05-22 18:15:10
【问题描述】:

我在 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)

【问题讨论】:

  • 您已经有了解决方案。但是你试过 purrr::map 或 dplyr::bind_rows 吗? purrr::map_dfr(filenames, ~openxlsx::read.xlsx(here::here("folder1", "folder2", .x), sheet=6, detectDates = TRUE)) 你不需要 for 循环和新函数。

标签: r dplyr stack tidyverse plyr


【解决方案1】:

根据关于使用 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

【讨论】:

    【解决方案2】:

    使用当前设置,我们可以初始化一个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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 2021-04-13
      • 2012-11-12
      相关资源
      最近更新 更多