在 igraph 收缩网络中处理顶点属性

Handling vertex attribute in an igraph shrinked network

提问人:Sebastián 提问时间:11/10/2023 最后编辑:Sebastián 更新时间:11/12/2023 访问量:41

问:

此查询紧随另一个查询(igraph r 中的合同顶点保留所有节点属性?)之后,该查询涉及折叠保留属性信息的网络。我一直在尝试从 igraph 属性对象中提取文本。这些属性不是原子向量,因为它们是 igraph 的合约函数的结果,作为获取字符和数字属性数据的一种方式:

g <- graph_from_literal(1,2-3-4,5-6,7).
V(g)$label <- c("wood", "wood products", "work", "work environment",
                "work environments", "young", "young consumers")
V(g)$number <- c(1,2,1,2,1,2,2)
g <- contract(g, mapping=c(1,1,3,4,4,6,7), vertex.attr.comb=c)
g <- delete.vertices(g, which(V(g)$name=="character(0)"))

我只需要获得一个标签,例如第一个标签,如果有多个标签。我试过:

first <- stri_extract_first_regex(V(g)$label, "[a-z]+")

但是,在单个文本的情况下,结果会产生“c”,而不是相应的标签。

提前致谢。

R iGraph

评论

0赞 Axeman 11/10/2023
我得到Error in contract(g, mapping = c(1, 1, 3, 4, 4, 4, 6, 7), vertex.attr.comb = c) : At core/operators/contract.c:78 : Invalid mapping vector length, Invalid value
1赞 Axeman 11/10/2023
你只是在寻找类似的东西吗?sapply(V(g)$label, `[`, 1)
0赞 Sebastián 11/10/2023
感谢您的建议。我更正了合同行中的错误。有 8 个标签,而不是 7 个标签。

答:

0赞 ThomasIsCoding 11/10/2023 #1

如果需要保留所有属性的第一个条目,则应使用vertex.attr.comb = first

g <- contract(g, mapping = c(1, 1, 3, 4, 4, 6, 7), vertex.attr.comb = first)

你会看到

> V(g)$label
[[1]]
[1] "wood"

[[2]]
character(0)

[[3]]
[1] "work"

[[4]]
[1] "work environment"

[[5]]
character(0)

[[6]]
[1] "young"

[[7]]
[1] "young consumers"


> V(g)$name
[[1]]
[1] "1"

[[2]]
character(0)

[[3]]
[1] "3"

[[4]]
[1] "4"

[[5]]
character(0)

[[6]]
[1] "6"

[[7]]
[1] "7"

此外,如果要删除具有“空”属性的顶点,可以尝试

g <- contract(g, mapping = c(1, 1, 3, 4, 4, 6, 7), vertex.attr.comb = first)
g <- delete.vertices(g, lengths(V(g)$name) == 0)

然后你会看到

> V(g)$label
[[1]]
[1] "wood"

[[2]]
[1] "work"

[[3]]
[1] "work environment"

[[4]]
[1] "young"

[[5]]
[1] "young consumers"


> V(g)$name
[[1]]
[1] "1"

[[2]]
[1] "3"

[[3]]
[1] "4"

[[4]]
[1] "6"

[[5]]
[1] "7"

评论

0赞 Sebastián 11/12/2023
谢谢。但这样一来,我就会丢失有关其他属性的信息(正如我所提到的,现在包含在示例中)。对于该属性,我必须保留所有信息(作为值的总和)。这就是为什么我在vertex.attr.comb中需要“c”选项而不是“first”,否则我会丢失信息。
0赞 Sebastián 11/12/2023
基于@Axeman,我用以下方法求解:V(g)$label <- sapply(V(g)$label, , 1) ;和:V(g)$number <- unlist(lapply(V(g)$number, sum))[
0赞 ThomasIsCoding 11/13/2023
@Sebastián是的,当然你可以用它来获取第一个而不是,绝对取决于你的需要sapplyvertex.attr.combo = first