【问题标题】:How to crate a network from a string vector如何从字符串向量创建网络
【发布时间】:2021-03-29 18:38:40
【问题描述】:

我正在尝试创建一个igraph 对象,将字符串向量拆分为特殊字符(“&”)。 我使用 for 循环创建一个向量并将其转换为网络图。 该代码有效,但在非常长的向量(大型网络)上效率极低。

有没有办法通过管道和映射来改进流程? 提前致谢

require(graph)
data <- data.frame(nodes=c("A","A & B","C","B & C","B & D"))

V <- c()
for (i in 1:nrow(data)){
  V_temp <- data[i,]
  ifelse(grepl(" & ", data$nodes[i]),
         N <- t(combn(unlist(strsplit(data$nodes[i], " & ")),2)),
         N <- matrix(rep(data$nodes[i],2), nrow = 1, ncol = 2))
  colnames(N) <- c("N1","N2")
  V_temp <- cbind(N, V_temp, row.names = NULL)
  V <- as.data.frame(rbind(V, V_temp, row.names = NULL))
}

vector <- rbind(as.vector(as.character(V$N1)),
                as.vector(as.character(V$N2)))
plot(graph(vector, directed = FALSE))

【问题讨论】:

    标签: r for-loop networking dplyr igraph


    【解决方案1】:

    如果你愿意使用dplyr

    library(dplyr)
    d <- data %>%
          separate(nodes, c("from", "to") ) %>%
          mutate(to = coalesce(to,from))
    
      from to
    1    A  A
    2    A  B
    3    C  C
    4    B  C
    5    B  D
    
    Warning message:
    Expected 2 pieces. Missing pieces filled with `NA` in 2 rows [1, 3]. 
    
    g <- graph_from_data_frame(d)
    

    separate 返回一个警告,告诉你有时没有什么可拆分的。在第二步中,您在“to”列中使用“from”列中的值填写 NA

    如果需要separate(nodes, c("from", "to"), " &amp; " ),也可以指定拆分。

    Split data frame string column into multiple columns

    How to split column into two in R using separate

    【讨论】:

      【解决方案2】:

      desval 的两个建议开始,我想出了这个。 这适用于在一个或两个节点上单独操作,但数量较多时失败。例如data &lt;- data.frame(nodes=c("E","A &amp; B","C","B &amp; C","B &amp; D &amp; E"))

      下面更新代码

      library(igraph)
      library(dplyr)
      
      selfloop <- function(x){
        y <- ifelse(!grepl(" & ",x), paste(x,x, sep = " & "), x)
        return(y)
      }
      
      data <- data.frame(nodes=c("E","A & B","C","B & C","B & D"))
      
      
      g <- data %>%
        mutate(nodes = selfloop(nodes)) %>%
        separate(nodes, c("from", "to"), sep = " & ") %>%
        graph_from_data_frame(directed = FALSE)
      
      plot(g)
      

      【讨论】:

      • 你需要一个向量吗?将带有 from 和 to 列的数据框传递给 igraph 要容易得多。这使您可以保持代码干净且易于阅读。而且,我猜它会更快。
      猜你喜欢
      • 2013-04-14
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 2021-09-12
      • 2013-01-08
      相关资源
      最近更新 更多