如何在 R 中创建单个分支实体/死胡同的外部叶子列表?

Posted

技术标签:

【中文标题】如何在 R 中创建单个分支实体/死胡同的外部叶子列表?【英文标题】:How to create an external leaf list of single branch entities / dead ends in R? 【发布时间】:2015-03-26 17:23:12 【问题描述】:

我有一个相当大的树状结构/树状图/网络(想想谱系),我想创建一个奇异连接的叶子/节点的列表。

在家谱中,我认为类似的东西被称为“Spitzenahnen”(德语)/但我认为它是特定于“未知父母”的,不一定没有后代。所以基本上结构中的死胡同,而不仅仅是顶部或底部是我想要找到的。

我从 Matrix 中看到了 post on creating a edge list 以及如何在 R 中看到 access the attributes of a dendrogram,但不确定如何应用它来获得我想要获得的具体结果。

我有数千个具有多个起点和终点的节点。我想创建一个节点/叶子列表,其中只有一个连接节点将其连接到树。因此,如果节点有两个或更多连接(有些最多有两打),我不想在我的列表中看到它。

使用赵京华的“Drawing pedigree diagrams with R and graphviz”中的标记图形我只想看到突出显示的节点,但一些适用的节点可能深埋在网络中,不一定在“边缘”。

【问题讨论】:

您能提供任何数据供我们使用吗?集合的dput 以及您迄今为止尝试过的任何代码都会很有用 【参考方案1】:

您似乎正在使用这些数据:

pre <- read.table(text="pid id father mother sex affected
10081 1 2 3 2 1
10081 2 0 0 1 2
10081 3 0 0 2 1
10081 4 2 3 2 1
10081 5 2 3 2 2
10081 6 2 3 1 2
10081 7 2 3 2 2
10081 8 0 0 1 2
10081 9 8 4 1 2
10081 10 0 0 2 2
10081 11 2 10 2 2
10081 12 2 10 2 1
10081 13 0 0 1 2
10081 14 13 11 1 2
10081 15 0 0 1 2
10081 16 15 12 2 2",header=T)

如果您正在查看类似图形的数据,您可以考虑使用igraph 库。这是创建类似情节的一种方法。

unit<-as.character(interaction(pre$father, pre$mother))
el<-rbind(
    data.frame(person=as.character(c(pre$father, pre$mother)), unit=unit, stringsAsFactors=F),
    data.frame(person=unit, unit=pre$id, stringsAsFactors=T)
)
el<-subset(el, person!="0" & person !="0.0" & unit!="0" & unit!="0.0")
gg<-simplify(graph.data.frame(el, vertices=rbind(
    data.frame(id=pre$id, type="person", affected=pre$affected==1, sex=pre$sex),
    data.frame(id=unique(unit), type="family", affected=FALSE, sex=0))))

V(gg)$color <- "grey"
V(gg)[type=="person" & !affected]$color <- "deepskyblue"
V(gg)$label <- ""
V(gg)[type=="person"]$label <- V(gg)$name
V(gg)$size <-2
V(gg)[type=="person"]$size <- 15
V(gg)$shape<-"circle"
V(gg)[sex==1]$sex<-"square"

哪个产生

(或类似的东西,默认布局算法是随机的)。

重塑数据有点混乱,但我的想法是我为每个联合创建伪节点,从而产生一个子节点。然后我将父节点连接为传入节点,将子节点连接为传出节点。

基本上你描述的节点都有一个连接,这意味着在图形设置中,它们的度数都是 1。我们可以将这些标签更改为红色以获得

V(gg)$label.color<-"black"
V(gg)[degree(gg)==1 & type=="person"]$label.color<-"red"

plot(gg)

或者你可以用

V(gg)[degree(gg)==1 & type=="person"]$name
# [1] "1"  "3"  "5"  "6"  "7"  "8"  "9"  "10" "13" "14" "15" "16"

【讨论】:

谢谢。这看起来很扎实。让我今天试一试以确保。

以上是关于如何在 R 中创建单个分支实体/死胡同的外部叶子列表?的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中创建切片树

R:如何使用其他列中的数据在一列中创建多个新值并为每个新值重复行?

切换分支时如何解决Update-Database问题?

如何使用 EF 核心在 SQLite 中创建自动增量列?

如何使用 EF 核心在 SQLite 中创建自动增量列?

如何在 SQL Server 中创建一个接受一列数据的函数?