【问题标题】:growing a data tree in R在 R 中生长数据树
【发布时间】:2015-09-13 17:00:28
【问题描述】:

我很抱歉在我的第一篇文章中没有提供足够的细节...... 我现在展示的实际上就是我用来弄清楚 与data.tree合作。

我正在尝试在树结构中组织数值模拟的输出,以供以后与 R 中的 data.tree 包一起使用。我的树的初始(预定义)结构是(无法将前两行放入灰色框):

require("data.tree")

mcdata <- Node$new("SNS")
FTS  <-                         mcdata$AddChild("First Target Station")
    BL1A <-                         FTS$AddChild("Beamline 1A")
    BL1B <-                         FTS$AddChild("Beamline 1B")
    BL1C <-                         FTS$AddChild("Beamline 1C")
    BL2  <-                         FTS$AddChild("Beamline 2")
    BL3  <-                         FTS$AddChild("Beamline 3")
    BL10 <-                         FTS$AddChild("Beamline 10")
    BL11A <-                        FTS$AddChild("Beamline 11A")
    BL11B <-                        FTS$AddChild("Beamline 11B")
    BL12  <-                        FTS$AddChild("Beamline 12")

STS  <-                         mcdata$AddChild("Second Target Station")
    BL1 <-                          STS$AddChild("Beamline 1")
    BL2 <-                          STS$AddChild("Beamline 2")
    BL3 <-                          STS$AddChild("Beamline 3")
    BL4 <-                          STS$AddChild("Beamline 4")
    BL5 <-                          STS$AddChild("Beamline 5")

处理模拟输出文件会产生类似的结果

  result <- c("First Target Station", "Beamline 11A", "RAPID", ...)

'result' 可能会变得更长,但是一旦我有一种合适的方式将“RAPID”添加为孩子,我认为以后添加任何孩子和/或属性应该很容易。 要决定是否需要添加一个名为“RAPID”的孩子,我执行以下操作 (知道“第一目标站”和“Beamline 11A”分支存在)。

  path <- mcdata$"First Target Station"$"Beamline 11A"$"RAPID"

如果长度(路径)为 0,我必须添加名为“RAPID”的孩子,否则我不必这样做。

这是直截了当的,但对于实际目的并不是很有用。我想我想要的是一种直接用结果中的元素构建“路径”的方法。 然而天真的尝试

  path <- mcdata$result[1]$result[2]$result[3]

我尝试过的主题的几个变体都不起作用...

任何如何解决我的小问题的建议将不胜感激......

谢谢,

克里斯

附:正如您可能会说的那样,我是一个新的“海报”,对面向对象的做事方式并不多。如果这不是问我问题的好方法,我提前道歉。

【问题讨论】:

  • 什么是 mcdata ?因为您是 SO 的初学者,所以我建议您阅读此线程以在您的问题中包含可重现的代码。stackoverflow.com/questions/5963269/…
  • 当然,请添加更多细节。这个stackoverflow.com/questions/31339805/… 可能会有所帮助
  • 好吧,data.tree 有自己的小方法。我会在接下来的几个小时内发布答案。感谢您提供详细信息。
  • assign('newPath', oldPath$AddChild(parsedFile[.]))$path
  • 我要补充一点,我尝试使用 'assign' 语句...感谢您考虑一下!

标签: r


【解决方案1】:

我将逐行执行此操作。当然,我猜您正在寻找一种自动化的方式来处理大量结果,但我认为从这里开始会是最好的。

# stack overflow
#    http://stackoverflow.com/questions/32552231/growing-a-data-tree-in-r
require("data.tree")

mcdata <- Node$new("SNS")

FTS  <-                         mcdata$AddChild("First Target Station")
  BL1A <-                         FTS$AddChild("Beamline 1A")
  BL1B <-                         FTS$AddChild("Beamline 1B")
  BL1C <-                         FTS$AddChild("Beamline 1C")
  BL2  <-                         FTS$AddChild("Beamline 2")
  BL3  <-                         FTS$AddChild("Beamline 3")
  BL10 <-                         FTS$AddChild("Beamline 10")
  BL11A <-                        FTS$AddChild("Beamline 11A")
  BL11B <-                        FTS$AddChild("Beamline 11B")
  BL12  <-                        FTS$AddChild("Beamline 12")

STS  <-                         mcdata$AddChild("Second Target Station")
  BL1 <-                          STS$AddChild("Beamline 1")
  BL2 <-                          STS$AddChild("Beamline 2")
  BL3 <-                          STS$AddChild("Beamline 3")
  BL4 <-                          STS$AddChild("Beamline 4")
  BL5 <-                          STS$AddChild("Beamline 5")

result <- c("First Target Station", "Beamline 11A", "RAPID")
result2 <- c("First Target Station", "Beamline_notme", "RAPID")

found_node <- mcdata$Climb(result[-3])
if(!is.null(found_node)){
  found_node$AddChild(result[3])
} else {
  mcdata$Climb(result[1])$AddChild(result[2])$AddChild(result[3])
}

mcdata

found_node2 <- mcdata$Climb(result2[-3])
if(!is.null(found_node2)){
  found_node$AddChild(result2[3])
} else {
  mcdata$Climb(result2[1])$AddChild(result2[2])$AddChild(result2[3])
}

mcdata

# based on the comment
#   here is one way to work through multiple results
#   assuming each result contains the full path
lapply(
  list(result,result2),
  function(z){
    Reduce(
      function(x,y){
        node <- x$Climb(y)
        if(is.null(node)){
          node <- x$AddChild(y)
        }
        node
      },
      z,
      init = mcdata
    )
  }
)

【讨论】:

  • 我之前太慢了,他的评论窗口对我超时了...非常感谢您的时间和精力,这会让我继续前进!你是绝对正确的,当然我计划定期扫描/重新扫描 100 多个文件并交互式处理模拟结果......克里斯
  • 我只是附加了一些代码来处理一长串结果。希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 2012-02-04
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 2016-07-14
  • 1970-01-01
相关资源
最近更新 更多