2014-07-22 15 views
2

dplyr是唯一可以处理我的843k data.frame并以快速查询的软件包。 我可以使用一些数学和平等标准过滤罚款,但是我需要实现一个概念的搜索。dplyr包:如何使用类似'%xyz%'的SQL语法来查询大型数据框?

我需要的是这样的sqldf查询

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

在dplyr帮助,我无法找到我怎么能做到这一点。例如:

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

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

+4

'dplyr是唯一可以处理我843k data.frame'的软件包 - 我强烈建议R package'数据。 table'。 – nrussell

+1

我做出了关注dplyr语法和“跳过data.table”的决定。我的整个应用程序已提交给dplyr,因此data.table解决方案可以,但本机dplyr是最好的。我认为dplyr是在引擎盖下使用data.table。 – userJT

+0

'dplyr'可以与数据表一起工作,但除非您明确加载'data.table'并将data.frames转换为data.tables,否则它不会在底层使用它。这样做可能会增加额外的速度。 – Gregor

回答

5

这个什么 -

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

编辑:另一种选择 - 在data.table()功能%like%

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 
+0

这太好了。所以最后,dplyr是最快的。最终的答案是:过滤器(虹膜,物种%像%“尼卡”)。如何在data.table中寻找%like%函数的帮助? – userJT

+0

是的,我相信 - 虽然,正如我所说的,我不是'data.table'的专家,我有一种感觉,'foo2()'正在做矢量扫描而不是二进制搜索,所以可能会出现一个更快的方法。无论如何,在'foo3()'中''like%''使用'filter'看起来相当快。 (在'library(data.table)'之后,如果你使用的是RStudio,你可以在帮助页面的搜索栏中输入'%like%',或者从你的控制台类型'?'%%'%'中输入。% – nrussell

+0

%like%实际上只是grepl的封装,所以只要grepl可能是最简单的 – userJT

2

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

require(data.table) 
iris %>% filter(tolower(Species) %like% 'nica') 
相关问题