R中的可变参数快速文本搜索函数

R中的可变参数快速文本搜索函数,r,search,data.table,text-search,R,Search,Data.table,Text Search,我有一个大型data.table中的以下示例数据: ddf = structure(list(id = 1:5, country = c("United States of America", "United Kingdom", "United Arab Emirates", "Saudi Arabia", "Brazil" ), area = c("North America", "Europe", "Arab", "Arab", "South America" ), city = c

我有一个大型data.table中的以下示例数据:

ddf = structure(list(id = 1:5, country = c("United States of America", 
 "United Kingdom", "United Arab Emirates", "Saudi Arabia", "Brazil"
 ), area = c("North America", "Europe", "Arab", "Arab", "South America"
 ), city = c("first", "second", "second", "first", "third")), .Names = c("id", 
 "country", "area", "city"), class = c("data.table", "data.frame"
 ), row.names = c(NA, -5L))

ddf
   id                  country          area   city
1:  1 United States of America North America  first
2:  2           United Kingdom        Europe second
3:  3     United Arab Emirates          Arab second
4:  4             Saudi Arabia          Arab  first
5:  5                   Brazil South America  third
> 
我必须创建一个函数,我可以向它发送可变数量的文本参数,该函数应该对数据执行和搜索,并输出包含所有文本搜索参数的所有行。不同的搜索字符串可以位于不同的列中

例如,searchfn(ddf,'巴西','第三')应该只打印最后一行

这个案子需要被忽略

数据量很大,因此需要快速优化搜索速度(因此需要使用data.table)

我试过:

searchfn = function(ddf, ...){
    ll = list(...)
    print(sapply(ll, function(x) grep(x, ddf, ignore.case=T)))
}

它拾取所有发送的搜索字符串并输出搜索的数字,但搜索不正确

这似乎有效,但我怀疑这是一个最佳解决方案:

searchfn = function(ddf, ...){
  ll = list(...)
  pat <- paste(unlist(ll), collapse = "|")
  X <- do.call(paste, ddf)
  Y <- regmatches(X, gregexpr(pat, X, ignore.case = TRUE))
  ddf[which(vapply(Y, function(x) length(unique(x)), 1L) == length(ll)), ]
}

是否从某个文本文件导入此数据?如果你把所有东西都当作一堆文本,那么data.frame/table格式就成了障碍。听起来你最好只
grep
-ing原始输入文件。您可以通过
pipe()
或其他方式将其读入R。这一点很好。但是,所选行需要进行数值统计分析,这无法在命令提示下使用文本文件完成。因此,在R本身中进行文本搜索和子集设置可能更容易。我建议您在R之外进行过滤,然后读入R进行统计。格雷格擅长快速文本搜索;R是为stats创建的;两者都不好。
searchfn(ddf, 'brazil', 'third')
searchfn(ddf, 'arab', 'first')
searchfn(ddf, "united", "second")
searchfn(ddf, "united", "second", "2")
searchfn(ddf, "united", "second", "Euro")