Настройка структуры данных 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?