首页 > 解决方案 > 使用循环创建网络组效率不高

问题描述

我有一个包含 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”与 key 的关联(反之亦然:key 与 ID 的关联)不是唯一的.
我想找到所有组及其密钥。
我在上一个问题上找到了一个解决方案:

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 万个观察值,效率不高。我将不胜感激有关使此代码高效的任何帮助。

标签: rcluster-analysisigraphnetwork-analysis

解决方案


你可以试试下面的代码

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

推荐阅读