【问题标题】:Using loop to create network group is not efficient使用循环创建网络组效率不高
【发布时间】:2021-11-20 20:23:46
【问题描述】:

我有一个包含 100 列的数据框,但此操作只需要两列。我只保留这样的两列:

org <- data.frame(
  ID = c( "ID1", "ID2", "ID3", "ID4", "ID5", "ID1", "ID2",
           "ID1", "ID2", "ID1", "ID2", "ID1", "ID2", "ID3",
           "ID1", "ID5", "ID1", "ID2", "ID1", "ID2", "ID3"),
  
  Key = c(1, 2, 3, 5, 7, 1, 2, 1, 8, 3, 9, 4,
           11, 15, 4, 17, 11, 15, 17, 4, 18)
)

请注意,“ID1”被分配给键 1、3、4、11 和 17。所以这些键在 group1 中
这里“3”也是 ID3 的键。
ID3 有键“15”和“18”。因此,“15”和“18”也将与 1、3、4、11、17、15、18 在同一组中。“ID”与键的关联(反之亦然:键与 ID)不是唯一的.
我想找到所有组及其密钥。
我在my previous question 上找到了解决方案:

t <- table(org$ID_id,org$key)

new_group <- list()

for (i in rownames(t)) {
  row_values <- names(t[i,][t[i,]>0])
  
  if(length(new_group)==0){
    new_group[[i]] <- row_values # add first key values to group 1
  } else{
    create_new_group <- TRUE
    for (list_item in seq_len(length(new_group))) {
      if(max(row_values %in% new_group[[list_item]]) == 1){# If key values (some or all) exist in current group
        new_group[[list_item]] <- unique(c(new_group[[list_item]],  row_values))
        create_new_group <- FALSE
      }
    }
    if(create_new_group){
      new_group[[length(new_group)+1]] <- row_values
    }
  }
  
}

这很好用。但是,我的数据框有 800 万个观察值,效率不高。我将不胜感激任何有助于提高此代码效率的帮助。

【问题讨论】:

    标签: r cluster-analysis igraph network-analysis


    【解决方案1】:

    你可以试试下面的代码

    g <- simplify(graph_from_data_frame(org))
    lapply(
      V(g)[names(V(g)) %in% org$ID],
      function(k) neighbors(g, k)
    )
    

    给了

    $ID1
    + 5/17 vertices, named, from 3a33432:
    [1] 1  3  4  11 17
    
    $ID2
    + 6/17 vertices, named, from 3a33432:
    [1] 2  8  9  4  11 15
    
    $ID3
    + 3/17 vertices, named, from 3a33432:
    [1] 3  15 18
    
    $ID4
    + 1/17 vertex, named, from 3a33432:
    [1] 5
    
    $ID5
    + 2/17 vertices, named, from 3a33432:
    [1] 7  17
    

    【讨论】:

      【解决方案2】:
      library(igraph)
       
      g = simplify(graph.data.frame(org, directed = FALSE))
      grp = decompose(g)
      lapply(grp, function(x){
          m = get.edgelist(x)
          list(id = unique(m[,1]),
               val = unique(m[,2]))
      })
      #[[1]]
      #[[1]]$id
      #[1] "ID1" "ID2" "ID3" "ID5"
      
      #[[1]]$val
      #[1] "1"  "3"  "4"  "11" "17" "2"  "8"  "9"  "15" "18" "7" 
      
      
      #[[2]]
      #[[2]]$id
      #[1] "ID4"
      
      #[[2]]$val
      #[1] "5"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-08
        • 2019-11-06
        • 2018-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-19
        • 1970-01-01
        相关资源
        最近更新 更多