igraph收缩网络顶点属性处理:提取首个标签遇问题求助
解决igraph收缩顶点后提取首个标签的问题
你遇到的问题根源是用contract()时指定vertex.attr.comb=c,会把合并顶点的属性值打包成字符向量(存储为列表形式),直接用stri_extract_first_regex()处理时,单个元素的向量会被当成字符串表达式(比如c("work")),所以提取到了开头的"c"。
两种解决思路:
思路1:收缩后提取首个标签
先从每个合并后的属性向量里取出第一个标签,再处理单词提取:
# 修复原代码的语法错误(去掉末尾的点) 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_labels <- sapply(V(g)$label, `[`, 1) # 提取首个标签的第一个单词 first_words <- stri_extract_first_regex(first_labels, "[a-z]+") # 查看结果 first_words
思路2:收缩时直接保留首个标签
更高效的方式是在contract()阶段就指定属性合并规则,直接保留每组的第一个属性值,避免后续处理:
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=list( label=function(x) x[1], number=function(x) x[1], name="concat" )) g <- delete.vertices(g, which(V(g)$name=="character(0)")) # 直接提取首个标签的第一个单词 first_words <- stri_extract_first_regex(V(g)$label, "[a-z]+")
两种方法都能解决单文本返回"c"的问题,思路2更简洁,减少后续数据处理步骤。
内容的提问来源于stack exchange,提问作者Sebastián
相关产品推荐
相关产品推荐

