R可重复研究的数据结构设置

时间:2018-02-23 20:49:10

标签: r reproducible-research

背景

我每小时报告一次建筑物中的设备,很多建筑物和很多设备。设备上的每个参数都称为一个点,它们已经有一个名称,我无法选择该点的名称。每个点名称都是唯一的。我要做的是在每栋建筑上运行标准报告。最后,我想把它移到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.equipmenttbl.point数据框,我只能在我的机器或数据库中的* .csv文件中存放(并且能够在Shiny中添加/编辑) 。点名称没有标准,并且不能保证每个设备都有每个点。使用select()contains()starts_with()助手是不可能的。

所以我刚刚创建了一个Equipment表,它在设备上有参数(在这种情况下是一个倍数)。此外,还有一个Point表,它告诉每个设备和哪个类别属于哪个类别。

对于这个简单的例子,我包含了两个示例函数。一个根据数据计算一个值,另一个根据故障进行测试。我过去最大的问题是当一台设备没有点时,它会停止执行,所以我必须手动进入并取出它或其他东西。我想解决方法是在运行那段代码之前使用exists()或类似的东西进行测试。

同样,对于这个简单的例子,我只是打印了一个情节,但输出可能是Markdown文档(我认为我以前做过,但不是这样)或Shiny(我创建了一些更简单的应用程序) )。

结论

最大的问题是“这是”正确的“做法吗?”我敢肯定这是非常常见的,必须有一个我没有使用的非常有效的方法。当我开始编写代码打印报告或将其转换为闪亮的应用程序时,有什么能帮助我取得成功?

0 个答案:

没有答案