R:从基表生成网络边缘列表(igraph)?

时间:2015-02-09 22:59:02

标签: r igraph sna

我正在尝试编写一个将在大型基表(下面的示例)中读取的函数,并检查是否可以通过15个以上的属性链接任何唯一实体(ID)(bank a / c,phone num,电子邮件,邮政编码...等)。这次不需要模糊匹配。

df <- data.frame( id = c('01','02','03','04','05','06','07','08','09','10'),
bank_acc=c('66201','66202','66203','66204','66205','66205','66205','66206','66207','66208'),
phone_num=c('10151','10150','10152','10150','10153','10150','10154','10155','10156','10157'))

我需要边缘列表格式的输出(下面的示例),所以我可以输入igraph,我打算使用“方法”列来对边缘进行颜色编码。 提前致谢

ID  Linked_ID Method 
05  06   bank_acc
05  07   bank_acc
06  07   bank_acc
02  04   phone_num
02  06   phone_num

1 个答案:

答案 0 :(得分:1)

您可以拆分感兴趣的字段,计算所有对(combn在这里有用),然后合并:

get.pairs <- function(colname) {
  spl <- split(df, df[,colname])
  do.call(rbind, lapply(spl, function(x) {
    if (nrow(x) == 1) {
      return(NULL)  # No duplicates for this value
    } else {
      combs <- combn(nrow(x), 2)
      return(data.frame(ID=x$id[combs[1,]], Linked_ID=x$id[combs[2,]], Method=colname, stringsAsFactors=F))
    }
  }))
}
do.call(rbind, lapply(c("bank_acc", "phone_num"), get.pairs))
#         ID Linked_ID    Method
# 66205.1 05        06  bank_acc
# 66205.2 05        07  bank_acc
# 66205.3 06        07  bank_acc
# 10150.1 02        04 phone_num
# 10150.2 02        06 phone_num
# 10150.3 04        06 phone_num