0

我正在尝试编写一个将读取大型基表(下面的示例)的函数,并检查是否可以通过 15 个以上的属性(银行账户、电话号码、电子邮件、邮编)链接任何唯一实体(ID)代码……等等)。这次不需要模糊匹配。

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
4

1 回答 1

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
于 2015-02-09T23:27:04.430 回答