Настройка структуры данных R для воспроизводимых исследований

Фон

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

Вопрос

Я на правильном пути? Есть ли более эффективный способ сделать это? Собираюсь ли я столкнуться с проблемами, когда начну писать отчеты по Markdown или перенести их в Shiny?

Образец кода

library(tidyverse)
set.seed(55)


test_func <- function(pointa, pointb, mult) {
  out = (pointb - pointa) * mult
  return(out)
}

test_fail <- function(pointa, pointb) {
  out = ifelse(pointa > (pointb - 9), 1, 0)
  return(out)
}

tbl.data <- data.frame(
  date = c(rep("2/1/2018", 24),
           rep("2/2/2018", 24),
           rep("2/3/2018", 24),
           rep("2/4/2018", 24),
           rep("2/5/2018", 24),
           rep("2/6/2018", 24),
           rep("2/7/2018", 24)),
  hour = rep(0:23, 7),
  equipa.vala = runif(168, min = 50, max = 60),
  equipb.vala = runif(168, min = 50, max = 60)
  ) %>%
  mutate(
    equipa.valb = 10 + equipa.vala * runif(168, min = 0.75, max = 1.25),
    equipb.valb = 10 + equipb.vala * runif(168, min = 0.75, max = 1.25)
  )

tbl.equip <- data.frame(
  equipment.id = c(1,2),
  equipment.name = c("equipa", "equipb"),
  equipment.mult = c(5, 7)
)

tbl.point <- data.frame(
  point = c("equipa.vala", "equipa.valb", "equipb.vala", "equipb.valb"),
  equipment = c("equipa", "equipa", "equipb", "equipb"),
  category = c("vala", "valb", "vala", "valb")
)

for (eq in tbl.equip[,2]) {

  vala <- as.character(
    tbl.point$point[tbl.point$equipment == eq &
                            tbl.point$category == "vala"]
  )
  valb <- as.character(
    tbl.point$point[tbl.point$equipment == eq &
                            tbl.point$category == "valb"]
  )

  equip.mult <- as.numeric(
    tbl.equip$equipment.mult[tbl.equip$equipment.name == eq]
  )

  for.data <- tbl.data %>%
    select_(cola = vala,
            colb = valb) %>%
    mutate(
      result = test_func(cola, colb, equip.mult),
      fault = test_fail(cola, colb)
    )

  score <- sum(for.data$fault)/length(for.data$fault)
  savings <- sum(for.data$result[for.data$result > 0])

  p1 <- ggplot(for.data, aes(x = colb, y = cola, color = as.factor(fault))) +
    geom_point() +
    annotate("text", label = paste("savings is:", savings), x = 50, y = 60) +
    annotate("text", label = paste("score is:", score), y = 51, x = 80) +
    ggtitle(paste("Equipment:", eq)) +
    theme_minimal()
  print(p1)
}

объяснение

Таким образом, в этом примере tbl.data фреймом данных будут данные, которые я получаю от каждого здания. Я должен был бы вручную создать tbl.equipment а также tbl.point фреймы данных, которые я просто поместил бы в файлы *.csv на моем компьютере или в базе данных (и мог бы добавлять / редактировать в Shiny). Там нет стандарта для имен точек, и нет гарантии, что каждая единица оборудования имеет каждую точку. С помощью select() помощники, такие как contains() или же starts_with() не может быть и речи.

Поэтому я только что создал таблицу "Оборудование", в которой указаны параметры оборудования (в данном случае это кратно). Кроме того, есть таблица очков, в которой указывается, к какому элементу оборудования и какой категории принадлежит каждая точка.

Для этого простого примера есть две функции-примера, которые я включил. Один вычисляет значение на основе данных, другой проверяет наличие неисправности. Моя самая большая проблема в прошлом состояла в том, что часть оборудования не имеет смысла, она останавливает выполнение, поэтому я должен вручную войти и снять его или что-то еще. Я думаю, что обходной путь должен использовать exists() или что-то подобное и протестируйте перед запуском этого кода.

Опять же, для этого простого примера я просто напечатал график, но на выходе мог быть документ Markdown (что, как мне кажется, я делал раньше, но не так) или Shiny (который я создал несколько более простых приложений).

Заключение

Главный вопрос: "Это" правильный "способ сделать это?" Я уверен, что это довольно часто, и должен быть действительно эффективный метод, который я не использую. Что заставит меня добиться успеха, когда я начну писать код для распечатки отчетов или переносить его в приложение Shiny?

0 ответов

Другие вопросы по тегам