具有 NA 的分层树:如何为 igraph 创建边

问题描述 投票:0回答:1

我有一个数据框,每行都有一个分类单元,每列都是该分类单元的一个描述级别。 我需要将此数据帧转换为两个数据帧,一个节点和一个边,以在 igraph 中使用。 并非所有分类单元级别(即列)都是完整的,即存在 NA。 从我的数据推断出的一个例子是这样的:

object_taxonomy = data.frame(class = c("Insecta", "Insecta", "Insecta", "Insecta", 
"Insecta", "Insecta", "Insecta", "Insecta", "Insecta", "Insecta"
), order = c("Hymenoptera", "Hemiptera", "Hemiptera", "Hemiptera", 
"Hemiptera", "Hemiptera", "Hemiptera", "Hymenoptera", "Hemiptera", 
"Hemiptera"), superfamily = c("Chalcidoidea", "Coccoidea", "Coccoidea", 
"Coccoidea", "Coccoidea", "Coccoidea", NA, "Chalcidoidea", "Coccoidea", 
"Coccoidea"), family = c("Azotidae", "Diaspididae", "Diaspididae", 
"Diaspididae", "Diaspididae", "Diaspididae", "Margarodidae", 
"Encyrtidae", "Diaspididae", "Diaspididae"), subfamily = c(NA, 
NA, NA, NA, NA, NA, NA, "Encyrtinae", NA, NA), tribe = c(NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_), 
    genus = c("Ablerus", "Chionaspis", "Diaspidiotus", "Diaspidiotus", 
    "Diaspidiotus", "Lepidosaphes", "Kuwania", "Lakshaphagus", 
    "", "Diaspidiotus"), scientificName = c("Ablerus celsus", 
    "Chionaspis salicis", "Diaspidiotus ostreaeformis", "Diaspidiotus perniciosus", 
    "Diaspidiotus prunorum", "Lepidosaphes ulmi", "Kuwania rubra", 
    "Lakshaphagus merceti", "", "Diaspidiotus gigas"))

创建节点的 data.frame 没有问题,在 NA 上进行收集和过滤。 相反,我正在寻求创建边缘 data.frame 的帮助,其中存在 NA 时会被跳过。

我想要实现的是:

来自
昆虫纲 膜翅目
昆虫纲 半翅目
膜翅目 Chalcidoidea
半翅目 球虫总科
Chalcidoidea 偶氮科
Chalcidoidea 虫科
膜翅目 Chalcidoidea
半翅目 球虫总科
球虫总科 双翅目
半翅目 马加罗迪科
虫科 Encyrtinae
偶氮科 阿布勒斯
Encyrtinae 拉克沙法古斯
双翅目 Chionaspis
双翅目 双翅目
双翅目 鳞茎类
马加罗迪科 桑尼亚
阿布勒斯 阿伯鲁斯
拉克沙法古斯 麦氏拉克沙噬菌
Chionaspis 柳叶鸬鹚
双翅目 Diaspidiotus ostreaeformis
双翅目 Diaspidiotus perniciosus
双翅目 梅花双翅果
鳞茎类 鳞蜥
桑尼亚 红桑
r igraph hierarchical
1个回答
0
投票

您可以尝试在

path
 中逐行添加 
object_taxonomy

library(igraph)

nodes <- Filter(nchar, unique(na.omit(unlist(object_taxonomy))))
make_empty_graph(n = length(nodes)) %>%
   set_vertex_attr("name", value = nodes) %>%
   Reduce(`+`,
      apply(object_taxonomy, 1, \(x) path(Filter(nchar, na.omit(x)))),
      init = .
   ) %>%
   simplify() %>%
   as_data_frame()

你将会实现

           from                         to
1       Insecta                Hymenoptera
2       Insecta                  Hemiptera
3   Hymenoptera               Chalcidoidea
4     Hemiptera                  Coccoidea
5     Hemiptera               Margarodidae
6  Chalcidoidea                   Azotidae
7  Chalcidoidea                 Encyrtidae
8     Coccoidea                Diaspididae
9      Azotidae                    Ablerus
10  Diaspididae                 Chionaspis
11  Diaspididae               Diaspidiotus
12  Diaspididae               Lepidosaphes
13 Margarodidae                    Kuwania
14   Encyrtidae                 Encyrtinae
15   Encyrtinae               Lakshaphagus
16      Ablerus             Ablerus celsus
17   Chionaspis         Chionaspis salicis
18 Diaspidiotus Diaspidiotus ostreaeformis
19 Diaspidiotus   Diaspidiotus perniciosus
20 Diaspidiotus      Diaspidiotus prunorum
21 Diaspidiotus         Diaspidiotus gigas
22 Lepidosaphes          Lepidosaphes ulmi
23      Kuwania              Kuwania rubra
24 Lakshaphagus       Lakshaphagus merceti
© www.soinside.com 2019 - 2024. All rights reserved.