我有一个数据框,每行都有一个分类单元,每列都是该分类单元的一个描述级别。 我需要将此数据帧转换为两个数据帧,一个节点和一个边,以在 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 |
双翅目 | 梅花双翅果 |
鳞茎类 | 鳞蜥 |
桑尼亚 | 红桑 |
您可以尝试在
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