如何用R语言检测分子中构成环结构的原子节点?
用R语言检测分子环结构中的原子
核心思路
分子的原子和化学键本质是无向图结构,环检测等价于找出图中的所有简单环(顶点不重复的环),再提取这些环包含的所有原子编号即可。R中igraph包是处理这类图问题的合适工具。
步骤与代码示例
假设你的数据结构:
nodes包含列:atom_id(原子编号)、X、Yedges包含列:from(起始原子编号)、to(终止原子编号)
- 安装并加载igraph包
# 首次使用需安装 install.packages("igraph") library(igraph)
- 构建无向图对象
将edges转换为igraph能识别的无向图,同时关联nodes的属性:
# 若edges存在重复键(多重键),先去重优化效率 edges <- unique(edges) # 构建无向图 g <- graph_from_data_frame(edges, directed = FALSE, vertices = nodes)
- 检测所有简单环
使用simple_cycles()函数获取图中所有简单环的顶点集合,可通过参数限定环的最小/最大大小:
# 获取所有简单环,比如指定最小环大小为3(默认值) cycles <- simple_cycles(g, min.length = 3)
- 提取环中的原子编号
将所有环的顶点合并后去重,得到所有属于环结构的原子:
ring_atoms <- unique(unlist(cycles)) # 按需求排序输出 sort(ring_atoms)
补充说明
- 若数据包含多个独立分子(多个子图),可拆分后分别检测:
subgraphs <- decompose(g) all_ring_atoms <- lapply(subgraphs, function(sg) { cycles <- simple_cycles(sg) unique(unlist(cycles)) })
simple_cycles()返回的顶点索引与nodes的行顺序对应,直接提取即可匹配原子编号。
内容的提问来源于stack exchange,提问作者Bachi Shashikadze
相关产品推荐
相关产品推荐

