如何在 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 中创建单个分支实体/死胡同的外部叶子列表?的主要内容,如果未能解决你的问题,请参考以下文章