我有以下数据,我想检查是否有2条记录具有相同的地址。
Id Class Address
42 18 PLOT#39 H#8-2-293/A4/A/
42 68 PLOT #39 H #8-2-293/A4/A
42 35 PLOT NO 1030 BUNGLOW NO
42 34 PLOT NO 1030 BUNGLOW NO
42 00 PLOT 1030 BUNGLOW NO 3
42 53 PLOT NO-39 H#8-2-293/A4/
42 70 GAYATRAI RESIDENCY MADHU
我使用 strsplit(dt $ Address,“”)对地址进行标记,并将其存储在列表变量中。如果70%的单词匹配,我会将其视为相同的地址。
我的问题是当我使用strplit()时,它给了我一个
> strsplit(dt$Address, " ")[1]
[[1]]
[1] "PLOT#39" "H#8-2-293/A4/A/"
所以在这里我无法迭代这些单词来检查这些单词是否存在于另一个地址列表中。如何检查它们是否几乎相等。
答案 0 :(得分:0)
您可以根据空间而不是标记它。尝试添加#
和/或/
以获得“更好”的单词列表。
> strsplit("PLOT#39 H#8-2-293/A4/A/", " |#")[1]
[[1]]
[1] "PLOT" "39" "H" "8-2-293/A4/A/"
> strsplit("PLOT#39 H#8-2-293/A4/A/", " |#|/")[1]
[[1]]
[1] "PLOT" "39" "H" "8-2-293" "A4" "A"
你如何从这里继续是一个艰难的过程 - 你可以检查有多少部分与其他部分匹配或其他一些算法。
答案 1 :(得分:0)
您可以查看实现大量不同字符串距离度量的stringdist
包。例如,
data <- "Id,Class,Address
42,18,PLOT#39 H#8-2-293/A4/A/
42,68,PLOT #39 H #8-2-293/A4/A
42,35,PLOT NO 1030 BUNGLOW NO
42,34,PLOT NO 1030 BUNGLOW NO
42,00,PLOT 1030 BUNGLOW NO 3
42,53,PLOT NO-39 H#8-2-293/A4/
42,70,GAYATRAI RESIDENCY MADHU"
data <- read.csv(textConnection(data), header=TRUE, stringsAsFactors=TRUE)
# Create a data.frame with all combinations of addresses
d2 <- expand.grid(data$Address, data$Address)
# remove duplicate addresses
d2 <- d2[d2[[1]] != d2[[2]], ]
# calculate distance
library(stringdist)
d2$d <- stringdist(d2[[1]], d2[[2]], method="jw")
有大量的字符串距离度量。我使用了Jaro-Winkler距离(通常用于比较名称),但您必须尝试查看哪一种最适合您。然后,您可以选择最相似的地址:
> # show records with a distance smaller than 0.15
> d2[d2$d < 0.15, ]
Var1 Var2 d
2 PLOT #39 H #8-2-293/A4/A PLOT#39 H#8-2-293/A4/A/ 0.05742205
8 PLOT#39 H#8-2-293/A4/A/ PLOT #39 H #8-2-293/A4/A 0.05742205
19 PLOT 1030 BUNGLOW NO 3 PLOT NO 1030 BUNGLOW NO 0.13937512
26 PLOT 1030 BUNGLOW NO 3 PLOT NO 1030 BUNGLOW NO 0.13937512
31 PLOT NO 1030 BUNGLOW NO PLOT 1030 BUNGLOW NO 3 0.13937512
32 PLOT NO 1030 BUNGLOW NO PLOT 1030 BUNGLOW NO 3 0.13937512
但是,根据地址的不同,您可能需要先对地址进行标准化。我不知道这样做的R包。我知道Febrl应该有一些用于地址标准化的工具,但我从未使用它们,因此无法评论它们的可用性。