使用 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")
尝试使用 lapply
和 grep
但它一直说它不能使用大于 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]
将隐藏第二个和后续的,这可能不是一件好事。
我有一个城市名称向量:
Cities <- c("New York", "San Francisco", "Austin")
并想用它在一个 1,000,000 多个元素的列中查找记录,这些列中的 city/state 个名称包含在更大的 table 中,并且与城市向量
中的任何项目相匹配Locations<- c("San Antonio/TX","Austin/TX", "Boston/MA")
尝试使用 lapply
和 grep
但它一直说它不能使用大于 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]
将隐藏第二个和后续的,这可能不是一件好事。