dplyr包:如何使用'%xyz%'来查询大数据框? SQL语法?

时间:2014-07-22 16:13:41

标签: r dplyr

dplyr是唯一能够处理我的843k data.frame并以快速方式查询它的软件包。 我可以使用一些数学和相同的标准来过滤,但是我需要实现搜索概念。

我需要像这样的sqldf查询

library(sqldf)
head(iris)
sqldf("select * from iris where lower(Species) like '%nica%'")

在dplyr帮助中,我无法找到如何做到这一点。类似的东西:

filter(iris,Species like '%something%')

开始和结束%非常重要。另请注意,数据帧有800 + k行,因此传统的R函数可能运行缓慢。它必须是基于dplyr的解决方案。

2 个答案:

答案 0 :(得分:6)

这个怎么样 -

library(dplyr)
data(iris)
filter(iris, grepl("nica",Species))

编辑:另一个选项 - %like%

中的data.table()函数
library(dplyr)
data(iris)
##
Iris <- iris[
  rep(seq_len(nrow(iris)),each=5000),
  ]
dim(Iris)
[1] 750000      5
##
library(microbenchmark)
library(data.table)
##
Dt <- data.table(Iris)
setkeyv(Dt,cols="Species")
##
foo <- function(){
  subI <- filter(Iris, grepl("nica",Species))
}
##
foo2 <- function(){
  subI <- Dt[Species %like% "nica"]
}
##
foo3 <- function(){
  subI <- filter(Iris, Species %like% "nica")
}
Res <- microbenchmark(
  foo(),foo2(),foo3(),
  times=100L)
##
> Res
Unit: milliseconds
   expr       min        lq    median        uq      max neval
  foo() 114.31080 122.12303 131.15523 136.33254 214.0405   100
 foo2()  23.00508  30.33685  39.77843  41.49121 129.9125   100
 foo3()  18.84933  22.47958  29.39228  35.96649 114.4389   100

答案 1 :(得分:2)

完整代码将是(包括小写)

require(data.table)
iris %>% filter(tolower(Species) %like% 'nica')