Определяемая пользователем функция для чтения и обработки часто используемых данных из Excel и SQL - PullRequest
0 голосов
/ 14 января 2020

Такое чувство, что это должно быть простой проблемой, но по какой-то причине я ее не получаю.

У меня есть куча столов, за которыми я должен добраться из SQL и других мест, и код становится длинным Это громоздко, и я просто хотел бы сжать ее, сделав функции () для каждой таблицы, чтобы при вызове, скажем, load_table1, он выполнял код SQL в R, чтобы загрузить table1 со всеми необходимыми манипуляциями. Я пробовал поиск, но функции - такая распространенная тема, что я не могу найти правильный ответ.

Цель состоит в том, чтобы иметь функцию (), которая содержит код, который читает данные с использованием read_xlsx () или dbGetQuery (), манипулирует данными, а затем загружает эту таблицу в R.

Итак, в качестве примера, если у меня есть таблица, которая выглядит как данные ниже, где есть ошибки в столбце YearOfManuf, я необходимо очистить ошибки и заменить значения средним значением YearOfManuf для префикса SerialNumber по каждой марке

data.table(Make = c("Toyota", "Toyota", "Toyota", "Toyota", "Toyota", "Toyota",
                "Mitsubishi", "Mitsubishi", "Mitsubishi", "Mitsubishi", "Mitsubishi", "Mitsubishi"),
           SerialNumber = c("ABC1", "ABC2", "ABC3", "ABC4", "ABC5", "ABC6", "ABC123", "ABC456", "ABC789", "ZYX123", "ZYX456", "ZYX789"),
           YearOfManuf = c(2017, "TEXT", 2010, 2019, 2070, 2019, 1999, 2000, 0, 1960, 2070, 2019))

. Поэтому я хотел бы прочитать приведенную выше таблицу и манипулировать ею в том же разделе кода, как показано ниже;

    example_table <-
data.table(Make = c("Toyota", "Toyota", "Toyota", "Toyota", "Toyota", "Toyota",
                    "Mitsubishi", "Mitsubishi", "Mitsubishi", "Mitsubishi", "Mitsubishi", "Mitsubishi"),
           SerialNumber = c("ABC1", "ABC2", "ABC3", "ABC4", "ABC5", "ABC6", "ABC123", "ABC456", "ABC789", "ZYX123", "ZYX456", "ZYX789"),
           YearOfManuf = c(2017, "TEXT", 2010, 2019, 2070, 2019, 1999, 2000, 0, 1960, 2070, 2019)) %>% 
  mutate(OriginalYearCol = YearOfManuf,
         SerialPrefix = substr(SerialNumber, 0, 3),
         YearOfManuf = gsub("[^0-9.-]", "NA", YearOfManuf),
         YearOfManuf = as.double(case_when(is.na(YearOfManuf)==T ~ "NA",
                                           YearOfManuf > 2020 ~ "NA",
                                           YearOfManuf < 1990 ~ "NA",
                                 TRUE ~ YearOfManuf))) %>%
  group_by(Make, SerialPrefix) %>% 
  mutate(AverageMakeModelYear = round(mean(YearOfManuf, na.rm = TRUE), 0),
         YearOfManuf = case_when(is.na(YearOfManuf) == TRUE ~ AverageMakeModelYear,
                                 TRUE ~ YearOfManuf))

Конечная цель состоит в том, чтобы записать вышеприведенное в функцию (), чтобы у меня был более аккуратный, более легкий ссылочный / найденный фрагмент кода для загрузки нужных мне таблиц.

...