【问题标题】:Variable argument fast text search function in RR中的可变参数快速文本搜索功能
【发布时间】:2014-11-06 22:24:31
【问题描述】:

我有以下来自大型 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
> 

我必须创建一个函数,我可以向其发送可变数量的文本参数,并且该函数应该对数据执行 AND 搜索并输出具有所有文本搜索参数的所有行。不同的搜索字符串可以在不同的列中。

例如 searchfn(ddf, 'brazil','third') 应该只打印出最后一行。

这个case需要忽略。

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

我试过了:

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

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

【问题讨论】:

  • 您是从某处的文本文件中导入这些数据吗?如果您将所有内容都视为一堆文本,那么 data.frame/table 格式就会妨碍您。听起来你最好只使用grep-ing 原始输入文件。您可以通过pipe() 或其他方式将其读入 R。
  • 好点。但是选择的行需要进行数值统计分析,这是命令提示符下的文本文件无法完成的。因此,在 R 本身中进行文本搜索和子集化可能更容易。
  • 我建议您在 R 之外进行过滤,然后读入 R 以进行统计。 Greg 擅长快速文本搜索; R 是为统计数据创建的;两者都不适合。

标签: r search data.table text-search


【解决方案1】:

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

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)), ]
}

这里有一些测试可供尝试:

searchfn(ddf, 'brazil', 'third')
searchfn(ddf, 'arab', 'first')
searchfn(ddf, "united", "second")
searchfn(ddf, "united", "second", "2")
searchfn(ddf, "united", "second", "Euro")

【讨论】:

    猜你喜欢
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多