【问题标题】:data.tree nodes through Id's通过 Id 的 data.tree 节点
【发布时间】:2017-04-14 20:42:51
【问题描述】:

我的数据通过IdParentId 系统链接,并且我设法添加了正确的整数levels,但是,我想编写一个函数,将我的 5 层层次结构自动嵌套为pathStringdata.tree

结构:

Id                 Name               ParentId           ParentName    Level
701F0000006Iw8E    'Paid Media'       NA                 NA            1
701F0000006IS1t    'Bing ABC'         701F0000006Iw8Y    'Bing'        3    
701F0000006IS28    'Bing DEF'         701F0000006Iw8Y    'Bing'        3
701F0000006IS23    'Bing GHI'         701F0000006Iw8Y    'Bing'        3
701F0000006Imq9    'Bing JKL'         701F0000006Iw8Y    'Bing'        3
701F0000006IS1y    'Bing MNO'         701F0000006Iw8Y    'Bing'        3
701F0000006Iw8Y    'Bing'             701F0000006Iw8E    'Paid Media'  2
701F0000006IvcW    'Google'           701F0000006Iw8E    'Paid Media'  2
7012A000006rhY8    'Adwords ABC'      701F0000006IvcW    'Google'      3
701F0000006IS1j    'Adwords DEF'      701F0000006IvcW    'Google'      3
701F0000006IS1o    'Adwords GHI'      701F0000006IvcW    'Google'      3
701F0000006IS1Z    'Adwords JKL'      701F0000006IvcW    'Google'      3
701F0000006Ieci    'Adwords MNO'      701F0000006IvcW    'Google'      3

目前,我遇到了 pathString 在以下情况下只能被单层读取的问题:

dat$pathString <- paste(dat$ParentId, 
      dat$Id, 
      sep = "/")

例如。

 "NA/701F0000000SOEq"

实际上,要正确填充整个树,我需要识别字符串中的所有后续父项:

 "NA/701F0000006Iw8E/701F0000006Iw8Y/701F0000006IS1t" for "Bing ABC"

理想情况下,单个表达式对所有级别都等效,但我理解是否需要单独处理每个级别。

Full Id,ParentId 系统在这里: Dropbox Link

【问题讨论】:

  • 我看不出这些数据与您链接到的问题有何不同。您是否至少尝试过该代码?究竟是什么不起作用?
  • 在这种情况下,它是字符级别而不是数字整数。在上一个问题的情况下,他使用ind+1while 的每次迭代期间逐步升级。我不确定如何通过字符值来做到这一点。即701F0000006Ieci + 1 = 701F0000006IvcW 然后701F0000006IvcW + 1 = 701F0000006Iw8E
  • 有什么理由需要对 data.trees 执行路径方法?循环并添加孩子似乎更简单?

标签: r tree hierarchical-data


【解决方案1】:

虽然您的问题要求提供路径字符串,但树可以直接从您的数据框格式构建。

library(data.tree)
dat <- read.table(text="
Id                 Name               ParentId           ParentName    Level
701F0000006Iw8E    'Paid Media'       NA                 NA            1
701F0000006IS1t    'Bing ABC'         701F0000006Iw8Y    'Bing'        2    
701F0000006IS28    'Bing DEF'         701F0000006Iw8Y    'Bing'        2
701F0000006IS23    'Bing GHI'         701F0000006Iw8Y    'Bing'        2
701F0000006Imq9    'Bing JKL'         701F0000006Iw8Y    'Bing'        2
701F0000006IS1y    'Bing MNO'         701F0000006Iw8Y    'Bing'        2
701F0000006Iw8Y    'Bing'             701F0000006Iw8E    'Paid Media'  3
701F0000006IvcW    'Google'           701F0000006Iw8E    'Paid Media'  3
7012A000006rhY8    'Adwords ABC'      701F0000006IvcW    'Google'      2
701F0000006IS1j    'Adwords DEF'      701F0000006IvcW    'Google'      2
701F0000006IS1o    'Adwords GHI'      701F0000006IvcW    'Google'      2
701F0000006IS1Z    'Adwords JKL'      701F0000006IvcW    'Google'      2
701F0000006Ieci    'Adwords MNO'      701F0000006IvcW    'Google'      2
", header=TRUE, stringsAsFactors = F)

# network build does not want a root node as a row, so adjust
# the given root to link to "tree_root"
dat$ParentId[is.na(dat$ParentId)] <- "tree_root"

# build the tree using the network layout - pairs of node ids
# in the first two columns. Remaining columns are node attributes
dat_network <- subset(dat, !is.na(dat$ParentId), c("Id", "ParentId", "Name"))
dat_tree <- FromDataFrameNetwork(dat_network, check = "check")

print(dat_tree, 'Name')

# 1  tree_root                              
# 2   °--701F0000006Iw8E          Paid Media
# 3       ¦--701F0000006Iw8Y            Bing
# 4       ¦   ¦--701F0000006IS1t    Bing ABC
# 5       ¦   ¦--701F0000006IS28    Bing DEF
# 6       ¦   ¦--701F0000006IS23    Bing GHI
# 7       ¦   ¦--701F0000006Imq9    Bing JKL
# 8       ¦   °--701F0000006IS1y    Bing MNO
# 9       °--701F0000006IvcW          Google
# 10          ¦--7012A000006rhY8 Adwords ABC
# 11          ¦--701F0000006IS1j Adwords DEF
# 12          ¦--701F0000006IS1o Adwords GHI
# 13          ¦--701F0000006IS1Z Adwords JKL
# 14          °--701F0000006Ieci Adwords MNO

【讨论】:

  • 我相信这里的概念是正确的,但它不起作用。这是我的 dropbox link 到 Id 和 ParentIds 的完整列表。
  • @gscott 我下载了你的数据并且可以构建树。您能否澄清“不工作” - 您能否提供一些您尝试过的代码。您下载的数据只有 id - 也许您出于某种原因剥离了名称,但如果没有任何其他名称,很难验证树。节点数这么多,树操作有点慢 - 我建议您阅读 data.tree 文档中有关性能的 cmets,以防您的实际数据比提供的数据更大。
  • 对不起@epi99 - 我最终以另一种方式接近这个,但我非常感谢你的回答。基本上,每当我尝试爬上父节点之类的东西时,我都会在我的树调用中得到“截断”的响应。而且你的时机是对的 - 我在一个闪亮的应用程序中使用它,所以响应性无法满足我所需的交互性。
猜你喜欢
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 2012-05-10
  • 2021-07-17
  • 1970-01-01
相关资源
最近更新 更多