从R中的字符串比较中提取最匹配的匹配项

时间:2014-02-15 20:20:44

标签: r text character string-matching

我目前在data.table代码中使用'agrep'函数和'lapply'来将用户提供的VIN#列表中的条目链接到DMV VIN#数据库。到目前为止,请参阅以下两个链接了解所有数据/代码:

Accelerate performance and speed of string match in R

Imperfect string match using data.table in R

有没有办法从我的列表中提取“最佳”匹配项:

  

dt< - dt [lapply(car.vins,function(x)agrep(x,vin.vins,max.distance = c(cost = 2,all = 2),value = T)),list( NumTimesFound = .N),vin.names]

因为截至目前,'agrep'功能为我提供了多个匹配,即使对成本,全部,替换等进行了大量修改。变量。

我也尝试使用'adist'功能代替'agrip',但因为'adist'没有像'agrep'那样的值= TRUE的选项,它会抛弃相同的

Error in `[.data.table`(dt, lapply(vin.vins, function(x) agrep(x,car.vins,  : 
x.'vin.vins' is a character column being joined to i.'V1' which is type 'integer'. 
Character columns must join to factor or character columns.

之前我收到的是'agrep'。

我可以使用其他一些包吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

Tom,这不是严格意义上的data.table问题。此外,如果没有您使用的数据,很难确切地知道您想要什么。我试图弄清楚你想要什么,我想出了这个解决方案:

vin.match <- vapply(car.vins, function(x) which.min(adist(x, vin.vins)), integer(1L))
data.frame(car.vins, vin.vins=vin.vins[vin.match], vin.names=vin.names[vin.match])
#   car.vins vin.vins vin.names
# 1  abcdekl   abcdef     NAME1
# 2   abcdeF   abcdef     NAME1
# 3  laskdjg  laskdjf     NAME2
# 4  blerghk  blerghk     NAME3

以下是数据:

vin.vins <- c("abcdef", "laskdjf", "blerghk")
vin.names <- paste0("NAME", 1:length(vin.vins))
car.vins <- c("abcdekl", "abcdeF", "laskdjg", "blerghk")

根据car.vins,这会找到vin.vins adist中每个值的最接近匹配项。我不确定此特定步骤是否需要data.table。如果您提供实际数据(或代表性样本),那么我可以提供更有针对性的答案。