我目前在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'。
我可以使用其他一些包吗?
谢谢!
答案 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
。如果您提供实际数据(或代表性样本),那么我可以提供更有针对性的答案。