0

我编写了一个函数,在给出文件夹的方向后,将其中的所有 excel 文件合并到一个数据框中,并进行一些适度的修改。

然而,我有两件小事想补充,但又遇到了困难:

  1. 每个文件的名称中都有一个国家代码,我希望该函数在数据框中创建一个附加列“国家”,其中每个观察值都将被分配这样的国家代码。名称示例:BGR_CO2_May12
  2. 每个文件由多张纸组成,每张纸代表年份;这些年也叫这些床单。我希望该函数创建另一列“Year”,其中每个观察都将被分配它来自的工作表的名称。

有没有一种巧妙的方法来做到这一点?可能不修改当前功能?

multmerge_xls_TEST <- function(mypath2) {

library(dplyr)
library(readxl)
library(XLConnect)
library(XLConnectJars)
library(stringr)

# This function gets the list of files in a given folder

re_file <- ".+\\.xls.?"
testFiles <- list.files(path       = mypath2, 
                        pattern    = re_file, 
                        full.names = TRUE)

# This function rbinds in a single dataframe the content of multiple sheets in the same workbook 
# (assuming that all the sheets have the same column types)
# It also removes the first sheet (no data there)

rbindAllSheets <- function(file) {
    wb <- loadWorkbook(file)
    removeSheet(wb, sheet = 1)
    sheets <- getSheets(wb)
    do.call(rbind,
            lapply(sheets, function(sheet) {
                           readWorksheet(wb, sheet)
            })
    )
}

# Getting a single dataframe for all the Excel files and cutting out the unnecessary variables

result <- do.call(rbind, lapply(testFiles, rbindAllSheets))
result <- result[,c(1,2,31)]
4

1 回答 1

0

尝试围绕readWorksheet(). 这会将文件名存储到变量中,并将工作Country表名称存储到Year. 您需要对文件执行一些正则表达式才能仅获取代码。

您也可以跳过包装器,只需mutate()在当前函数中添加该行。请注意,这使用了dplyr您已经引用过的包。

read_worksheet <- function(sheet, wb, file) {

  readWorksheet(wb, sheet) %>%
    mutate(Country = file,
           Year = sheet)

}

那么你可以在你已经拥有的功能中做这样的事情。

rbindAllSheets <- function(file) {
    wb <- loadWorkbook(file)
    removeSheet(wb, sheet = 1)
    sheets <- getSheets(wb)
    do.call(rbind,
            lapply(sheets, read_worksheet, wb = wb, file = file)
    )
}

另请注意,bind_rows()另一个dplyr功能可以代替您的do.call(rbind, ...)电话。

bind_rows(lapply(sheets, read_worksheet, wb = wb, file = file))
于 2019-10-24T19:12:24.600 回答