我正在尝试编写一个将在大型基表(下面的示例)中读取的函数,并检查是否可以通过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
答案 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