【发布时间】:2014-03-12 21:12:43
【问题描述】:
好的,所以我不久前发布了一个关于编写 R 函数以加速大型文本文件的字符串匹配的问题。我睁大眼睛看到“data.table”,我的问题得到了完美的回答。
这是该线程的链接,其中包含所有数据和详细信息:
Accelerate performance and speed of string match in R
但现在我遇到了另一个问题。有时,由于在 DMV 填写汽车信息时的人为错误,提交的 VIN#s(在“vinDB”文件中)与“carFile”文件中的一个或两个字符不同。有没有办法编辑
dt[J(car.vins), list(NumTimesFound=.N), by=vin.names]
该代码行(由上述链接中的@BrodieG 提供)以允许识别相差一两个字符的 VIN#?
如果这是一个简单的更正,我深表歉意。我对 R 中的“data.table”包的强大功能感到不知所措,并且很想尽可能多地了解它的实用性,而且这个论坛的知识渊博的成员对我来说绝对是关键。
**编辑:
所以我一直在按照建议使用“lapply”和“agrep”函数,我一定是做错了什么:
我尝试替换这一行:
dt[J(car.vins), list(NumTimesFound=.N), by=vin.names]
用这个:
dt <- dt[lapply(vin.vins, function(x) agrep(x,car.vins, max.distance=2)), list(NumTimesFound=.N), vin.names, allow.cartesian=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.
但它们都是“chr”类型。有谁知道我为什么会收到这个错误?我是否以正确的方式考虑这一点,即:我在这里正确使用 lapply 吗?
谢谢!
【问题讨论】:
-
这并不容易。我建议您匹配将匹配的内容,然后对于剩下的任何内容,针对不匹配的汽车的 VIN 计算不匹配的项目的 Levenshtein Distance(未链接包不适用于 R3.0.2,仅供参考)匹配。如果您确定错误出现在 VIN 字符串的特定区域,那么这会变得更容易,但从您的描述来看,听起来并非如此。
-
谢谢@BrodieG。有没有办法将“agrep”函数合并到代码中?
-
是的,但是昂贵的操作不会在
data.table中。您需要lapplyagrep到您尝试匹配的每个 VIN。它可以完成,但它不是微不足道的,它可能会很慢,具体取决于您有多少坏 VINS 以及有多少候选 VINS。当然不是小修改,至少不是我能想到的。 -
我明白了。非常感谢您,您对此的见解非常有帮助。是否有您推荐的链接可以用作“data.table”操作的教程(除了它的包描述页面)?
-
您可以查看 [data.table 常见问题解答](datatable.r-forge.r-project.org/datatable-faq.pdf) 以及查看评价较高的问题/答案
data.tableSO 上的标签。
标签: string r performance text data.table