gpt4 book ai didi

r - 如何将带有父属性的XML属性解析为R中的数据帧

转载 作者:行者123 更新时间:2023-12-03 17:08:51 26 4
gpt4 key购买 nike

我正在尝试解析 XML 文件节点和属性。文件内有一组具有属性的节点。嵌套的 XML 结构类似于一个数据框,带有“我想将其解析为数据框”。

这是一个示例文件:

<?xml version="1.0" encoding="UTF-8"?>
<TrackMate version="3.8.0">
<Model spatialunits="µm" timeunits="sec">
<AllTracks>
<Track name="Track_2" TRACK_ID="2" NUMBER_SPOTS="140" NUMBER_GAPS="0" >
<Edge SPOT_SOURCE_ID="960769" SPOT_TARGET_ID="960778" LINK_COST="0.08756957830926632" />
<Edge SPOT_SOURCE_ID="958304" SPOT_TARGET_ID="958308" LINK_COST="1.4003359672950089" />
<Edge SPOT_SOURCE_ID="958316" SPOT_TARGET_ID="958322" LINK_COST="1.6985623204008202" />
</Track>
<Track name="Track_145" TRACK_ID="145" NUMBER_SPOTS="141" NUMBER_GAPS="0" >
<Edge SPOT_SOURCE_ID="961623" SPOT_TARGET_ID="961628" LINK_COST="2.2678642015413755" />
<Edge SPOT_SOURCE_ID="962122" SPOT_TARGET_ID="962127" LINK_COST="38.20777704254654" />
<Edge SPOT_SOURCE_ID="961869" SPOT_TARGET_ID="961873" LINK_COST="0.2895609647324684" />
</Track>
</AllTracks>
</Model>
</TrackMate>

我想创建一个包含边缘所有属性和父级 TRACK_ID 属性的数据框。我可以轻松地创建具有所有边缘属性的数据框:

edges = data.frame(t(data.frame(xml_attrs(xml_find_all(xmlDoc, xpath = paste0('/TrackMate/Model/AllTracks//Edge'))))))
row.names(edges) = NULL

但是随后相应的轨道 ID 就会丢失。我可以用 for 循环解决这个问题,但这通常不是“R 方式”。我想知道是否有更简单的解决方案? (例如使用 xpath 查询)。

所以最终期望的输出将是这个数据框: output data frame

编辑:这更接近,但是 Track 节点和 Edge 节点混合在一个列表中。

xml_find_all(xmlDoc, xpath = paste0('/TrackMate/Model/AllTracks//Edge | /TrackMate/Model/AllTracks/Track'))

最佳答案

“技巧”是获取所有边缘节点的列表,并使用 xpath从那里...您可以使用 ancestor 从每个边缘节点中选择 Trach 节点。来自xpath .

使用的库

#load libraries
library( xml2 )
library( magrittr )

示例数据

doc <- read_xml('<?xml version="1.0" encoding="UTF-8"?>
<TrackMate version="3.8.0">
<Model spatialunits="µm" timeunits="sec">
<AllTracks>
<Track name="Track_2" TRACK_ID="2" NUMBER_SPOTS="140" NUMBER_GAPS="0" >
<Edge SPOT_SOURCE_ID="960769" SPOT_TARGET_ID="960778" LINK_COST="0.08756957830926632" />
<Edge SPOT_SOURCE_ID="958304" SPOT_TARGET_ID="958308" LINK_COST="1.4003359672950089" />
<Edge SPOT_SOURCE_ID="958316" SPOT_TARGET_ID="958322" LINK_COST="1.6985623204008202" />
</Track>
<Track name="Track_145" TRACK_ID="145" NUMBER_SPOTS="141" NUMBER_GAPS="0" >
<Edge SPOT_SOURCE_ID="961623" SPOT_TARGET_ID="961628" LINK_COST="2.2678642015413755" />
<Edge SPOT_SOURCE_ID="962122" SPOT_TARGET_ID="962127" LINK_COST="38.20777704254654" />
<Edge SPOT_SOURCE_ID="961869" SPOT_TARGET_ID="961873" LINK_COST="0.2895609647324684" />
</Track>
</AllTracks>
</Model>
</TrackMate>')

代码

#find all edge nodes
edge.nodes <- xml_find_all( doc, ".//Edge")
#build the data.frame
data.frame( TRACK_ID = xml_find_first( edge.nodes, ".//ancestor::Track") %>% xml_attr("TRACK_ID"),
SPOT_SOURCE_ID = edge.nodes %>% xml_attr("SPOT_SOURCE_ID"),
SPOT_TARGET_ID = edge.nodes %>% xml_attr("SPOT_TARGET_ID"),
LINK_COST = edge.nodes %>% xml_attr("LINK_COST") )

输出

#   TRACK_ID SPOT_SOURCE_ID SPOT_TARGET_ID           LINK_COST
# 1 2 960769 960778 0.08756957830926632
# 2 2 958304 958308 1.4003359672950089
# 3 2 958316 958322 1.6985623204008202
# 4 145 961623 961628 2.2678642015413755
# 5 145 962122 962127 38.20777704254654
# 6 145 961869 961873 0.2895609647324684

关于r - 如何将带有父属性的XML属性解析为R中的数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54631992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com