我有一个矩阵,从中我可以用 igraph 构建网络图。我想将不同类型顶点的信息存储为一个属性,我可以从它的名称中推断出来。我尝试了几种组合
mymat = matrix(c(1,0),6,5)
colnames(mymat) <- c("tim", "tom","jane","tarzan", "maria")
rownames(mymat) <- c("tim", "tom","jane","tarzan", "maria", "megan")
M <- graph_from_incidence_matrix(mymat)
V(M)$gender <- ifelse(V(M) == startsWith(as.character(V(M)),"t"), "male","female")
V(M)$gender
[1] "female" "female" "female" "female" "female" "female" "female" "female" "female" "female" "female"
我开始了但忘了调用属性的名称。
V(M)
V(M)$name
V(M)$gender <- ifelse(V(M)$name == startsWith(as.character(V(M)$name),"t"), "male","female")
那里也没有。偶然我称之为:
V(M)$gender <- ifelse(V(M) == startsWith(as.character(V(M)$name),"t"), "male","female")
V(M)$gender
[1] "male" "female" "female" "female" "female" "female" "female" "female" "female" "female" "female"
但为什么不是其他人,我想?好像只看第一个?
V(M)$gender <- ifelse(V(M) == startsWith(as.character(V(M)$name),"to"), "male","female")
V(M)$gender
再次,什么都没有。
我使用 ifelse 的方式有问题吗?我需要写一个函数吗?
我调用属性名称的方式有问题吗?
题外话:为什么 graph_from_incidence_matrix 或 igraph 通常会创建“类型”属性,并且此处指定的理由是“假”和“真”。你可以在这里看到它
get.vertex.attribute(M)
答案 0 :(得分:0)
我不是 igraph
的专家,但我想尽我所能尝试回答。如果有人看到这个答案并注意到不正确的地方,请发表评论以便我修复!
首先,听起来您希望确定哪些顶点以字母“t”开头并分配一个 gender
值。根据 V(M)
,您的图中有 11 个顶点:
V(M)
+ 11/11 vertices, named, from f5ca776:
[1] tim tom jane tarzan maria megan tim tom jane tarzan maria
有些名称重复。
首先检查名称是否以“t”开头,您的代码在这里部分正确:
startsWith(V(M)$name, "t")
# alternative: startsWith(attr(V(M), "names"), "t")
[1] TRUE TRUE FALSE TRUE FALSE FALSE TRUE TRUE FALSE TRUE FALSE
这为您提供了一个逻辑向量,其中 names
属性以“t”开头。这看起来是正确的。
因此,对于您的 ifelse
语句,您已经拥有确定 gender
所需的逻辑值。您无需将其与 V(M)
进行比较。
M <- set_vertex_attr(M,
"gender",
value = ifelse(startsWith(V(M)$name, "t"), "male", "female"))
M
IGRAPH f5ca776 UN-B 11 15 --
+ attr: type (v/l), name (v/c), gender (v/c)
+ edges from f5ca776 (vertex names):
[1] tim --tim tim --tom tim --jane tim --tarzan tim --maria jane --tim jane --tom jane --jane
[9] jane --tarzan jane --maria maria--tim maria--tom maria--jane maria--tarzan maria--maria
您现在已经为 gender
创建了属性:
V(M)$gender
[1] "male" "male" "female" "male" "female" "female" "male" "male" "female" "male" "female"
现在,您注意到创建了 type
属性。您的图已确定为二部图:
is_bipartite(M)
[1] TRUE
要可视化,您可以执行以下操作:
plot(M, layout = layout_as_bipartite(M))
或者根据 type
以这种方式修复:
V(M)[type]$color <- 'green'
V(M)[!type]$color <- 'yellow'
V(M)$x <- c(rep(1, 6), rep(2, 5))
V(M)$y <- c(seq(1, 5, length.out = 6), seq(1, 5, length.out = 5))
V(M)$label.cex <- .5
V(M)$size <- 30
plot(M)
基于 TRUE/FALSE 值,我们用绿色和黄色着色并在空间上分开。