【问题标题】:R: Loop for importing multiple xls as df, rename column of one df and then merge all df'sR:循环将多个xls导入为df,重命名一个df的列,然后合并所有df
【发布时间】:2016-09-16 16:21:29
【问题描述】:

下面的内容让我有点抓狂,我相信有一个简单的解决方案。

我目前使用 R 从一堆 excel 文件中执行一些计算,这些文件是每月对财务数据的观察。这些文件都具有完全相同的列标题。每个文件都被导入,对其进行一些计算,并将输出保存到一个列表中。导入下一个文件并重复该过程。我为此使用以下代码:

filelist <- list.files(pattern = "\\.xls") 
universe_list <- list()  

count <- 1
for (file in filelist) {
  df <- read.xlsx(file, 1, startRow=2, header=TRUE)
  *perform calcs*
  universe_list[[count]] <- df   
  count <- count + 1
}

我现在遇到一个问题,我想要执行的一些新操作会涉及来自两个或多个 Excel 文件的数据。例如,我需要导入 Jan-16 和 Jan-15 的 Excel 文件,执行需要完成的任何操作,然后继续执行下一组文件(Feb-16 和 Feb-15)。这些文件的长度总是固定的(比如一年等)

我似乎无法弄清楚如何执行此操作的代码……从流程的角度来看,我在想 1)需要设计一个循环来同时导入两组文件,2)从导入的文件中创建两个数据框数据,3)重命名数据框之一的列(以便可以区分列),4)将两个数据框合并在一起,以及 4)执行计算。我无法为此计算出步骤 1-4 的代码!

非常感谢您的帮助

【问题讨论】:

    标签: r loops import merge rename


    【解决方案1】:

    考虑mapply() 一起处理两个数据帧对。您当前的循环实际上让人想起其他运行 for 循环操作的语言。然而,R 有许多向量化的方法来迭代列表。下面假设 15 年和 16 年的文件列表的长度相同,并且两者中都有相应的月份,并且年份缩写正好在文件扩展名之前(即,-15.xls-16.xls em>):

    files15list <- list.files(path, pattern = "[15]\\.xls") 
    files16list <- list.files(path, pattern = "[16]\\.xls") 
    
    dfprocess <- function(x, y){
                    df1 <- read.xlsx(x, 1, startRow=2, header=TRUE) 
                    names(df1) <- paste0(names(df1), "1")            # SUFFIX COLS WITH 1
    
                    df2 <- read.xlsx(y, 1, startRow=2, header=TRUE) 
                    names(df2) <- paste0(names(df2), "2")            # SUFFIX COLS WITH 2
    
                    df <- cbind(df1, df2)                            # CBIND DFs
                    # ... perform calcs ...
                    return(df)  
                 }
    
    wide_list <- mapply(dfprocess, files15list, files16list)        
    
    long_list <- lapply(1:ncol(wide_list),                          
                        function(i) wide_list[,i])                   # ALTERNATE OUTPUT
    

    【讨论】:

      【解决方案2】:

      首先对您的文件列表进行排序,使您要进行计算的两个文件彼此连续。之后试试这个:

      count <- 1
      for (count in seq(1, (len(filelist)),2) {
                   df <- read.xlsx(filelist[count], 1, startRow=2, header=TRUE)
                   df1 <- read.xlsx(filelist[count+1], 1, startRow=2, header=TRUE)
                   *change column names and apply merge or append depending on requirement 
                   *perform calcs*
                   *save*
           }
      

      【讨论】:

        猜你喜欢
        • 2021-10-06
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 1970-01-01
        • 2020-01-17
        • 2020-11-28
        • 2014-10-28
        • 1970-01-01
        相关资源
        最近更新 更多