使用 R,如何使用字符向量在非常大的字符向量中搜索匹配项

Using R, How to use a character vector to search for matches in a very large character vector

我有一个城市名称向量:

Cities <- c("New York", "San Francisco", "Austin")

并想用它在一个 1,000,000 多个元素的列中查找记录,这些列中的 city/state 个名称包含在更大的 table 中,并且与城市向量

中的任何项目相匹配
Locations<- c("San Antonio/TX","Austin/TX", "Boston/MA")

尝试使用 lapplygrep 但它一直说它不能使用大于 1 的输入向量维度。

理想情况下 return Locations 向量中的行位置包含 Cities 向量中的任何项目,这将使我能够 select 匹配更广泛的 table 中的行。

grep 和家人只允许在通话中使用一个 pattern=,但可以使用 Vectorize 来帮助解决此问题:

out <- Vectorize(grepl, vectorize.args = "pattern")(Cities, Locations)
rownames(out) <- Locations
out
#                New York San Francisco Austin
# San Antonio/TX    FALSE         FALSE  FALSE
# Austin/TX         FALSE         FALSE   TRUE
# Boston/MA         FALSE         FALSE  FALSE

(我添加rownames(.)纯粹是为了从源数据中识别columns/rows。)

有了这个,如果你想知道哪个索引指向哪里,那么你可以这样做

apply(out, 1, function(z) which(z)[1])
# San Antonio/TX      Austin/TX      Boston/MA 
#             NA              3             NA 
apply(out, 2, function(z) which(z)[1])
#      New York San Francisco        Austin 
#            NA            NA             2 

第一个表示 Cities 中适用于每个特定位置的索引。第二个表示 Locations 中适用于每个 Cities 的索引。这两种方法都假定最多存在一对一匹配;如果有更多,which(z)[1] 将隐藏第二个和后续的,这可能不是一件好事。