Присвоение имени файла и имени листа (нескольким) наблюдениям в R - PullRequest
0 голосов
/ 24 октября 2019

Я написал функцию, которая после указания направления папки берет все файлы Excel внутри нее и объединяет их во фрейм данных с небольшими изменениями.

Тем не менее, у меня есть две небольшие вещи, которые яхотел бы добавить, но бороться с:

  1. Каждый файл имеет код страны в названии, и я хотел бы, чтобы функция создавала дополнительный столбец во фрейме данных «Страна», где каждое наблюдениебудет назначен такой код страны. пример имени: BGR_CO2_May12
  2. Каждый файл состоит из множества листов, причем каждый лист представляет год;эти листы также называются этими годами. Мне бы хотелось, чтобы функция создала еще один столбец «Год», где каждому наблюдению будет присвоено имя листа, из которого оно получено.

Есть ли удобный способ сделать это? Возможно без изменения текущей функции?

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)]

1 Ответ

0 голосов
/ 24 октября 2019

Попробуйте сделать обертку вокруг 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))
...