寻找在一个数据帧类似的行(未重复)中的R

问题描述:

我有> 800K行的数据集(例如):寻找在一个数据帧类似的行(未重复)中的R

id  fieldA  fieldB    codeA codeB 
120 Similar one addrs example1  929292 0006 
3490 Similar oh addrs example3  929292 0006 
2012 CLOSE CAA addrs example10232 kkda9a 0039 
9058 CLASE CAC addrs examplekkda9a 0039 
9058 NON DONE  addrs example010193 kkda9a 0039 
48848 OOO AD ADDD addrs example18238 uyMMnn 8303 

字段ID是唯一ID,这两个字段CODEa所和codeB必须是相同的,但fieldA和fieldB需要Levenshtein距离或类似的功能。我需要找到哪些行非常相似。输出可能是一些上线:

codeA codeB Similar 
    929292 0006 120;3490 
    kkda9a 0039 2012;9058 
    kkda9a 0039 9058 
    uyMMnn 8303 48848 

为数据集这个大是行不通的,不会太大的意义,如果我有2个constrainsts像CODEa所和codeB距离矩阵。我猜一个办法是一个plyr功能通过CODEa所-codeB分裂,但我之后

为了澄清卡住了,我想一起组有两个FIELDA fieldB相似度极高的所有行,并在代码A codeB中具有完全匹配。


编辑:

继大卫DeWert理念,沿着这条线的东西似乎每个CODEa所-codeB组工作,而不是一个很好的输出放似乎在正确的道路一步:

library(stringdist) 
clustering<-function(x){ 
    if(nrow(x)>1){{d<-stringdistmatrix(paste(x$fieldA,x$fieldB),paste(x$fieldA,x$fieldB),method = "qgram") 
    rownames(d)<-x$id 
    hc <- hclust(as.dist(d)) 
    #I need to evaluate correctly this cutting 
    res<-cutree(hc,h=5) 
    #This returns a list, one element for each cluster found and a named vector inside with the elements 
    return(res) 
    }else{ 
    res<-1 
    names(res)<-x$id 
    return(res) 
    } 
} 

现在我需要找到一种方法来分割codeA-codeB组中的数据帧并将其应用于它们。


EDIT2:

我管理的“足够好”的方式为这个使用以前的功能集聚和plyr包。

result<-dlply(testDF,.(codeA,codeB),clustering) 

这种 “由CODEa所组,codeB” 创建与每个列表,如:

$`929292.0006` 
120 3490 
    1 1 

$kkda9a.0039 
2012 9058 9058 
    1 1 2 

$uyMMnn.8303 
48848 
    1 

attr(,"split_type") 
[1] "data.frame" 
attr(,"split_labels") 
    codeA codeB 
1 929292 0006 
2 kkda9a 0039 
3 uyMMnn 8303 

其中由FIELDA和fieldB通过CODEa所和codeB创建组有效集群。这没有得到我想要的结果,但因为我不能得到更好的解决方案,所以必须这样做。我最大的抱怨是,plyr函数的性质不会让我获得超过1行的分组(这是完全有道理的),所以我不得不使用list作为结果而不是数据框,这不是一个真正的问题。问题出现在数据集非常大(像这样)并且plyr不能很好地与它们一起工作时...而且替代dplyr软件包与列表结果不兼容......哦。

+1

我不确定你的问题是明确的。具体而言,如果“类似的”具有距离“类似于0”的距离1并且距离“类似”的距离为1,并且想要将距离彼此相距的值分组。你是否在同一组中包含“类似于0”和“类似1”(彼此距离为2)? – Jthorpe 2015-02-11 17:21:10

+0

你说的没有定义好。是的,我想将字段A和字段B中具有高度相似性的所有行组合在一起,并且在代码A和代码B中具有完全匹配。 – Rwak 2015-02-11 17:32:07

创建一个名为 “codeAB” 新字段根据CODEa所-codeB匹配像这样对数据进行分区:

data$codeAB <- factor(apply(data[ , c(4,5) ] , 1 , paste , collapse = "-")) 

然后用Damerau-的Levenshtein簇中的每个的levels(data$codeAB)。 人们似乎认为ELKI http://en.wikipedia.org/wiki/ELKI擅长于在不构建距离矩阵的情况下聚集大量数据。

有人也问d-L指标在ELKI: Clustering string data with ELKI

我希望帮助。

+0

我不完全知道如何使用距离度量来处理这些组。任何关于如何在R中做的指针? – Rwak 2015-02-12 14:53:07