如何解决在函数中堆叠不同的数据帧
我无法在 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
,然后在rbind.fill
内应用do.call
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。