Как построить функцию, которая перебирает фреймы данных и преобразует в них данные (R) - PullRequest
2 голосов
/ 03 апреля 2020

Я пытаюсь импортировать данные из электронной таблицы Excel, выбирая только набор листов (не все листы), а затем выполняя несколько шагов преобразования данных (поворачивайте больше и изменяйте тип данных).

Я получил это в 4 строках кода, и я теоретически мог бы скопировать и вставить этот блок для каждого листа (всего 8), но я хотел бы посмотреть, смогу ли я через все это сделать oop функция.

Шаги следующие:

1) Прочитать спецификации c листов и сохранить их в виде фреймов данных

2) Повернуть больше столбцов 2: 13

3) Измените новые значения столбца с типа даты Excel (цифра c) на фактическую дату

4) Измените дату в формате yearmon

Вот мой код для выполняя это для одного листа:

kerrie <- read_excel("report.xlsx", sheet = "KERRIE_DATA") # load Kerrie data sheet
kerrie <- pivot_longer(kerrie, 2:13, names_to = "month") # put months into rows
kerrie$month <- excel_numeric_to_date(as.numeric(kerrie$month), date_system = "modern") # change date data type
kerrie$month <- as.yearmon(kerrie$month) # turn into yearmon

Вот вектор со всеми именами листов

sheetNames <- c("KERRIE_DATA", "GAIL_DATA", "DANIELLE_DATA", "ISABELLE_DATA","ESTELLE_DATA", "CLARE_DATA", "JEN_DATA", "CHRIS_DATA")

И вот решение, которое я нашел для шага 1: оно проходит через Excel Excel и импортирует мои нужные листы, сохраняя их как фреймы данных

library(openxlsx)
a <- loadWorkbook("report.xlsx")
for(i in 1:length(sheetNames))
{
  assign(sheetNames[i],readWorkbook(a,sheet = i))
}

Можете ли вы помочь мне выполнить шаги 2: 4 в функции / l oop, пожалуйста?

1 Ответ

2 голосов
/ 03 апреля 2020

Вы можете написать функцию со всеми шагами:

apply_fun <- function(sheet_name) {
     kerrie <- readxl::read_excel("report.xlsx", sheet = sheet_name) 
     kerrie <- tidyr::pivot_longer(kerrie, 2:13, names_to = "month")
     kerrie$month <- janitor::excel_numeric_to_date(as.numeric(kerrie$month), 
                      date_system = "modern") 
     kerrie$month <- zoo::as.yearmon(kerrie$month) 
     return(kerrie)
}

и применить ее ко всем листам

complete_data <- lapply(sheetNames, apply_fun)

Это вернет вам список кадров данных в complete_data.

...